SQL LEFT 外部联接只有来自右侧的一些行?

标签 sql left-join

我有两张 table TABLE_ATABLE_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/

相关文章:

sql - MySql:为什么这个查询运行这么慢?

mysql - 复杂的SQL join 根据给定的结构进行查询

mySQL 返回不应该的结果

sql - TSQL Left Join with multiple right hand rows

mysql - 左连接语句中子查询的重复条目

mysql - 如何在 MySQL 中限制仅显示 2 行相同的值

asp.net - "SELECT TOP {x}"查询的 LINQ to SQL 性能

mysql - 在 MySQL 中,如何将整数列表传递给存储过程中的预准备语句?

mysql - SQL - 如何在多个表上使用更多 COUNT?

php - Laravel 在 leftjoin 处分页