Условное условие при объединении таблиц в SQL Server - PullRequest
2 голосов
/ 19 марта 2019

У меня есть две таблицы, содержащие данные о сотрудниках, TableA и TableB, я объединяю их на основе двух идентификаторов (одна - userID, а другая mID (идентификатор на основе месяца)) с использованием LEFT OUTER JOIN, который возвращает NULL примерно в 20% результатов, потому что TableB он неполный.Я хочу - если возможно - запрос, который обнаруживает, если соединение не находит совпадения, и вычитает один месяц до mID, чтобы объединение могло покрыть как минимум процент пропущенных данных только старыми данными.

Я не знаю, является ли это слишком сложным запросом, но я имел в виду что-то вроде:

SELECT T1.*, T2.*
FROM TABLEA
LEFT OUTER JOIN TABLEB
ON T2.USERID = T1.USERID AND (CASE WHEN (T2.HID = T1.HID) = NULL THEN (T2.HID = T1.HID-1))

Оцените любую помощь.

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Вы были на правильном пути, используя оператор case, но он был немного не в порядке.Предупреждение!Я не проверял это, но я думаю, что сталкивался с чем-то похожим в прошлом.

SELECT      T1.*
            ,T2.*
FROM        TABLEA  t1
LEFT JOIN   TABLEB  t2  ON      T2.USERID = T1.USERID
                            AND T2.HID =    CASE
                                                WHEN T2.HID = T1.HID then t1.hid
                                                else T1.HID - 1
                                            end
0 голосов
/ 19 марта 2019

Я думаю, это то, что вы действительно хотите сделать; недостаток в том, что здесь немного больше логики, и он будет дублироваться на столбец, но он обеспечивает отличное управление.

DECLARE @TableA TABLE (USERID INT,HID INT,SomeData VARCHAR(20))
DECLARE @TableB TABLE (USERID INT,HID INT,SomeData VARCHAR(20))

INSERT INTO @TableA(USERID,HID,SomeData) SELECT 1,5,'Now'
INSERT INTO @TableA(USERID,HID,SomeData) SELECT 2,5,NULL
INSERT INTO @TableA(USERID,HID,SomeData) SELECT 3,5,NULL

INSERT INTO @Tableb(USERID,HID,SomeData) SELECT 2,4,'Now-1'
INSERT INTO @Tableb(USERID,HID,SomeData) SELECT 2,3,'Now-2'
INSERT INTO @Tableb(USERID,HID,SomeData) SELECT 3,4,'Now-1'

SELECT
    t1.USERID, T1.Hid AS [Current HID]
    ,
        CASE
            WHEN T1.SomeData IS NOT NULL THEN T1.SomeData
            WHEN T2.USERID IS NOT NULL THEN T2.SomeData
            WHEN T3.USERID IS NOT NULL THEN T3.SomeData
            ELSE T1.SomeData
        END AS [Most Recent SomeData]
FROM @TABLEA T1
LEFT JOIN @TABLEB T2 ON T2.USERID = T1.USERID AND T2.HID = T1.HID
LEFT JOIN @TABLEB T3 ON T3.USERID = T1.USERID AND T3.HID = T1.HID-1
...