在 SQL 服务器中的单个 JOIN 语句中查找 0、1 或可能 2 个匹配项

Find 0, 1, or possibly 2 matches within a single JOIN statement in SQL Server

是否有一种简单的方法可以从 JOIN 语句中的同一 table 行中找到可能存在的两个不同匹配项?例如,我有一个名为 st 的存储 table,如下所示:

Unique ID    Log_ID1    [other fields]    Log_ID2
1            25         ...               30

有一个名为 lt 的日志 table,当 Log_IDx 字段被填充时,它被写入,它看起来像这样:

Log_ID    SomeDetail
1         ...
...       ...
25        I need this part if Log_ID1 is not null
...       ...
30        I also need to get this part if Log_ID2 is not null

table st 将使用一些数据进行初始化,然后根据需要使用 Log_ID1 和 Log_ID2 数据更新该行。如果其中一个存在,我需要获取日志数据,或者如果两者都存在,我需要获取两行。我已经试过了,但它不起作用:

SELECT [fieldList]
FROM   lt a
INNER JOIN st b ON a.Log_ID = b.Log_ID1
INNER JOIN st c ON a.Log_ID = c.Log_ID2

如果我删除其中一个 INNER JOIN,它会起作用,但它不会 return 所有数据(显然)如果同时填充 Log_ID1 和 Log_ID2。因此,这也不起作用:

SELECT [fieldList]
FROM   lt a
INNER JOIN (st b ON a.Log_ID = b.Log_ID1) [AND][OR]
(st c ON a.Log_ID = b.Log_ID2)

可以在两个 Log_ID 字段中使用 NULL,或者在其中一个字段中使用 NULL,或者让它们都包含数据。

是否有 simple/elegant 构造可以根据存储状态 table 提取 0、1 或 2 行数据?或者我是否必须编写一些丑陋的代码才能得到我想要的东西?也许是某种工会?

从语法上讲,因为它可能更容易理解,所以我正在寻找可以做到这一点的东西,但要是合法的语法:

SELECT [fieldList]
FROM   lt a
INNER JOIN st b ON a.Log_ID IN (b.Log_ID1, b.Log_ID2)

可能是这样,取决于你的数据内容 UNION ALL 会保留所有数据,UNION 会删除重复的

SELECT [fieldList]
FROM   lt a
INNER JOIN st b ON a.Log_ID = b.Log_ID1

UNION ALL

SELECT [fieldList]
FROM   lt a
INNER JOIN st b ON a.Log_ID = b.Log_ID2

您需要 LEFT OUTER JOIN 而不是 INNER JOIN。然后你包含一个 WHERE 子句来过滤掉两个结果都为 NULL 的行。

像这样:

SELECT [fieldList]
  FROM lt a
  LEFT OUTER JOIN st b ON a.Log_ID = b.Log_ID
  LEFT OUTER JOIN st c ON a.Log_ID = c.Log_ID
 WHERE NOT (b.Log_ID IS NULL AND c.Log_ID IS NULL)