我有2张桌子。
表1 =可交付成果(这是一个常数表)
表2 = pass_deliverable
表1包含(主键)deliverable_id,deliverable_title,deliverable_desc,admin_id,flag
表2包含(主键)passed_deliverable_id,deliverable_id,user_id,flag
现在我想要从deliverable_id
回复table 1
,我的WHERE
子句就是,它不会从deliverable_id
回显table 1
在table 2
。
具体而言,如果deliverable_id
已存在table 1
,我想比较deliverable_id
中的table 2
和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
答案 0 :(得分:3)
您可以使用WHERE NOT EXISTS
检查另一个表中是否存在匹配的数据。下面的查询将返回所有未通过的可交付成果。
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)
答案 1 :(得分:3)
您需要使用左连接来排除pass_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
。
答案 2 :(得分:1)
SELECT deliverable_id
FROM deliverable
WHERE deliverable_id NOT IN (
SELECT deliverable_id
FROM passed_deliverable
)