使用联接比较 sql 查询中的两个表

Comparing two tables in sql query using join

我有 2 个 table。

table 1 = 可交付成果(这是一个常数 table)
table 2 = passed_deliverable

table 1个包含(主键)deliverable_id, deliverable_title, deliverable_desc, admin_id, flag
table 2包含(主键)passed_deliverable_id, deliverable_id, user_id, flag

现在我想从 table 1 回显 deliverable_id 而我的 WHERE 子句是,它不会从 table 1 回显 deliverable_id 哪个已经在 table 2.

具体来说,我想比较table 1中的deliverable_idtable 2中的deliverable_id,如果deliverable_id已经存在于table 2,当我使用查询时,它不会在 table 1 中回显。

这是我目前拥有的。

SELECT deliverable.deliverable_id, passed_deliverable.passed_deliverable_id, 
       deliverable.deliverable_title, deliverable.deliverable_desc,
       deliverable.adviser_id
FROM deliverable
INNER JOIN passed_deliverable
ON deliverable.deliverable_id=passed_deliverable.deliverable_id
WHERE deliverable.deliverable_id!=passed_deliverable.deliverable_id  

您可以使用WHERE NOT EXISTS检查另一个table中是否不存在匹配数据。下面查询returns所有未通过的可交付成果。

SELECT 
  deliverable_id, deliverable_title, deliverable_desc, adviser_id
FROM deliverable d
WHERE 
  NOT EXISTS (
      SELECT 'x' 
      FROM passed_deliverable pd 
      WHERE pd.deliverable_id = d.deliverable_id)

您需要使用左联接来排除 passed_deliverable 中的行:

SELECT deliverable.deliverable_id,
       deliverable.deliverable_title,
       deliverable.deliverable_desc,
       deliverable.adviser_id
FROM deliverable
LEFT OUTER JOIN passed_deliverable
    ON deliverable.deliverable_id = passed_deliverable.deliverable_id
WHERE passed_deliverable.deliverable_id IS NULL

这会从 deliverable 获取所有内容,然后尝试将其加入 passed_deliverable(如果存在)。所以你可能会在内存中得到这样的东西:

deliverable_id  passeddeliverable.deliverable_id  ... other columnss
1               1
2               NULL
3               3

然后您的 WHERE 子句排除 passeddeliverable 没有匹配项的行(在我的示例 id 2 中),即 passed_deliverable.deliverable_id IS NULL.

SELECT deliverable_id
FROM deliverable
WHERE deliverable_id NOT IN (
  SELECT deliverable_id 
  FROM passed_deliverable
)