sql - SQL Server 中连接表时的条件

标签 sql sql-server t-sql join case

我有两个表都包含员工数据,TableATableB,我根据 2 个 ID(其中一个是 userID)加入它们另一个 mID(基于月份的 id))使用 LEFT OUTER JOIN,它在大约 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))

感谢任何帮助。

最佳答案

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

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

关于sql - SQL Server 中连接表时的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55248165/

相关文章:

sql - 错误 : invalid input syntax for integer: ""

c# - Entity Framework 批量插入/更新关系

sql-server - 使用计数的意外输出sql server

sql - 具有多个外部应用行的大型表比较性能

sql - 如何将查询记录到数据库驱动程序?

mysql - SQL group by week的一些问题

sql - 将 select 语句中的子查询重构为 join

内部有角色的 SQL Server 用户角色

mysql - 检测MySQL数据库中的字符串,如果为假则添加前缀?

sql - 对产品 UPC varchar(20) 进行 JOIN 的最佳方法?