【问题标题】:Conditional condition when joining tables in SQL Server在 SQL Server 中联接表时的条件条件
【发布时间】:2019-08-10 09:40:49
【问题描述】:

我有两个表都包含员工数据,TableATableB,我使用 @ 987654325@ 在大约 20% 的结果中返回 NULL,因为 TableB 它不完整。如果可能的话,我想要一个查询来检测连接是否找不到匹配项并将一个月减去 mID,这样 JOIN 可以仅用旧数据覆盖至少一部分丢失的数据。

我不知道这是否是一个太复杂的查询,但我想到了类似的东西:

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))

感谢任何帮助。

【问题讨论】:

  • 评论:使用“IS NULL”而不是“= NULL”
  • 我认为您需要在此处提供一些示例数据和所需的输出。
  • 尝试以这种方式处理密钥确实是个坏主意,原因有很多。为什么使用“旧”数据加入甚至有效?
  • @DavidTansey,TableB 可能包含与一个月前相同的数据(通常为 95%-ish),但我无法自己更新表格,此外,该表格只是包含tableA的相同员工的参考数据

标签: sql sql-server tsql join case


【解决方案1】:

我认为这是你真正想做的;缺点是有更多的逻辑,每列都会重复,但它提供了精细的控制。

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

【讨论】:

    【解决方案2】:

    通过使用案例陈述,您走在了正确的轨道上,但它只是有点乱。警告!我没有测试它,但我相信我过去遇到过类似的事情。

    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
    

    【讨论】:

    • 您的解决方案有效减少了 NULLS,但允许重复,所以我得到了双倍的结果。
    • 添加 distinct 会解决欺骗问题吗?没有测试数据,我无法判断。
    • 是的,我刚刚做到了!将 LEFT JOIN 切换为 INNER,但我仍然需要手动检查数据。
    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2012-09-17
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多