使用联接比较 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_id
和table 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
)
我有 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_id
和table 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
)