【发布时间】:2017-02-23 08:41:47
【问题描述】:
我无法理解。
SELECT COUNT(*) FROM profiles
WHERE profiles.status IN ('abc', 'man')
AND profiles.id IN (
SELECT artifacts.item_id FROM artifacts
WHERE artifacts.deleted_at IS NULL
AND artifacts.item_type = 'Profile'
AND artifacts.upload_type = 'bill'
);
count
-------
12514
(1 row)
上述查询计算配置文件的重复记录(工件有多个记录)。当我以 distinct 运行上述查询时,我得到了正确的计数。
SELECT COUNT(DISTINCT(id)) FROM profiles
WHERE profiles.status IN ('abc', 'man')
AND profiles.id IN (
SELECT artifacts.item_id FROM artifacts
WHERE artifacts.deleted_at IS NULL
AND artifacts.item_type = 'Profile'
AND artifacts.upload_type = 'bill'
);
count
-------
12157
(1 row)
对于同一配置文件,工件可以有多个记录。但据我了解IN 查询不会让任何重复的配置文件计入。我对吗?或者有什么我想念的吗?
更新:
我尝试将查询减少到 2 个不同的过滤条件。两种情况都可以正常工作。请在下面找到。
=> SELECT COUNT(*) FROM profiles WHERE profiles.id IN (
SELECT artifacts.item_id FROM artifacts
WHERE artifacts.deleted_at IS NULL
AND artifacts.item_type = 'Profile'
AND artifacts.upload_type = 'bill');
count
-------
22664
(1 row)
=> SELECT COUNT(DISTINCT(id)) FROM profiles WHERE profiles.id IN (
SELECT artifacts.item_id FROM artifacts
WHERE artifacts.deleted_at IS NULL
AND artifacts.item_type = 'Profile'
AND artifacts.upload_type = 'bill');
count
-------
22664
(1 row)
=> SELECT COUNT(DISTINCT(id)) FROM profiles
WHERE profiles.status IN ('abc', 'man');
count
-------
20109
(1 row)
=> SELECT COUNT(*) FROM profiles
WHERE profiles.status IN ('abc', 'man');
count
-------
20109
因此,当两个IN 查询结合使用时,就会发生重复。有没有人熟悉这种用例。
【问题讨论】:
-
这是一个愚蠢的问题 - 您是否有可能在配置文件表中有重复的 ID?
-
@paqash 不可能。 ID 是主键。
-
尝试运行
SELECT id FROM profiles... except SELECT distinct id FROM profiles..以获取“不明确的 id”列表?..
标签: postgresql subquery in-subquery