我有两张 table TABLE_A
和 TABLE_B
将加入的列作为员工编号 EMPNO
.
我想做一个正常的左外连接。然而,TABLE_B
有某些被软删除的记录( status='D'
),我希望包含这些记录。澄清一下,TABLE_B
可能有事件记录(状态 = null/a/anything)以及已删除的记录,在这种情况下,我不希望该员工出现在我的结果中。但是如果TABLE_B
中只有员工的删除记录我希望员工包含在结果中。我希望我能明确我的要求。 (我可以做一个冗长的 qrslt 之类的事情并得到我想要的,但我认为必须有一种更优化的方式来使用连接语法来做到这一点)。将不胜感激任何建议(即使没有加入)。他的新手正在尝试以下查询,但没有得到预期的结果:
SELECT TABLE_A.EMPNO
FROM TABLE_A
LEFT OUTER JOIN TABLE_B ON TABLE_A.EMPNO = TABLE_B.EMPNO AND TABLE_B.STATUS<>'D'
非常感谢任何帮助。
最佳答案
只是为了澄清 - TABLE_A 中的所有记录都应该出现,除非表 B 中的行具有除 'D' 以外的状态?
B 上至少需要一个非空列(我将使用“B.ID”作为示例,这种方法应该有效):
SELECT TABLE_A.EMPNO
FROM TABLE_A
LEFT OUTER JOIN TABLE_B ON
(TABLE_A.EMPNO = TABLE_B.EMPNO)
AND (TABLE_B.STATUS <> 'D' OR TABLE_B.STATUS IS NULL)
WHERE
TABLE_B.ID IS NULL
也就是说,反转您可能认为的逻辑——仅在您有排除 TABLE_A 条目的行的地方加入 TABLE_B,然后在最后使用 IS NULL 来排除那些。这意味着只有那些不匹配的(那些在 TABLE_B 中没有行,或者只有 'D' 行的)被包括在内。
另一种选择可能是
SELECT TABLE_A.EMPNO
FROM TABLE_A
WHERE NOT EXISTS (
SELECT * FROM TABLE_B
WHERE TABLE_B.EMPNO = TABLE_A.EMPNO
AND (TABLE_B.STATUS <> 'D' OR TABLE_B.STATUS IS NULL)
)
关于SQL LEFT 外部联接只有来自右侧的一些行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1322001/