Ваш запрос кажется, что он должен вернуть указанный результат. Одно из возможных объяснений результатов, которые вы получаете (без строк), заключается в том, что нет загруженных билетов, которые не были выкуплены.
Этот запрос, кажется, предполагает, что ticketid
УНИКАЛЕН в downloadedtickets
таблице, и UNIQUE в redeemedtickets
таблице ... что может быть так, но мы не имеем эту информацию из спецификации мы были предоставлены. (Если это не так, то COUNT (*) для ticketid
от только downloadedtickets
таблицы может быть больше, чем один.
ли ticketid
правого столбца использовать для «соответствия» строки из двух таблиц? Мы . «буду считать, что это, потому что это то, что ваш запрос с использованием (. Если это не так, что может объяснить результат вы получаете)
Ваш запрос вида (более легко читается):
SELECT t.ticketid
FROM (SELECT d.ticketid
FROM downloadedtickets d
UNION ALL
SELECT r.ticketid
FROM redeemedtickets r
) t
GROUP BY t.ticketid
HAVING COUNT(*) = 1
Отметим, что существует потенциал, что этот запрос может вернуть ticketid
для строка в redeemedtickets
, которая не находится в downloadedtickets
. Может быть какая-то гарантия, что этого не произойдет, но опять же, эта информация отсутствует в спецификации.
Для больших комплектов материализация того, что вид сверху, может быть дорогим.
Лично я предпочел бы использовать запрос с более эффективным узором «присоединиться анти»:
SELECT d.ticketid
FROM downloadedtickets d
LEFT
JOIN redeemedtickets r
ON r.ticketid = d.ticketid
WHERE r.ticketid IS NULL
ORDER BY d.ticketid
Это по существу говорит, возвращает все строки из downloadedtickets
, наряду с любыми «согласующих» строк из redeemed
Билеты. Ключевое слово LEFT
делает это «внешним» соединением, поэтому мы получаем все строки из таблицы с левой стороны, независимо от того, имеются ли соответствующие строки из таблицы справа. Трюк - это предикат в предложении WHERE
, который отфильтровывает все строки, которые имели совпадение. (Если есть совпадение, мы гарантировали, что ticketid
из redeemedtickets
будет не NULL. Таким образом, только те строки, которые будут иметь значение NULL из этой таблицы будет строки из downloadedtickets
, которые не имеют соответствия.
Этот запрос может эффективно использовать индекс на redeemedtickets
с ведущей колонке ticketid
.
Это не единственный запрос, который возвращает указанный результат, есть и другие шаблоны запросов, которые могут возвращать эквивалентный результат.
Вы абсолютно правы. Спасибо. –