Я не могу это понять.Почему запрос в результатах запроса дублирует записи
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)
Вышеуказанный запрос подсчитывает повторяющиеся записи профилей (для которых артефакты имеют несколько записей). Когда я запускаю указанный выше запрос с помощью я получаю правильный счет, который ниже.
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
Использовано запросов в конъюнкции. Кто-нибудь знаком с таким вариантом использования.
Вот глупый вопрос - у вас есть дубликаты идентификаторов в таблице профилей? – paqash
@paqash Невозможно. Идентификатор - это первичный ключ. – dnsh
попробуйте запустить 'SELECT id FROM profiles ... за исключением SELECT различных id FROM profiles..', чтобы получить список« not distinct id »? .. –