SQLite - Как выбрать записи из одной таблицы, которых нет в другой таблице - PullRequest
0 голосов
/ 18 июня 2020

У меня есть база данных с 3 таблицами; tblCustomers, tblBookings, tblFlights.

Я хочу найти фамилию клиента (LName) в таблице «Клиенты», где клиенты не отображаются в таблице бронирований. Он должен вернуть только три имени, но он возвращает имена по 10 раз каждое. В таблице бронирования 10 записей, поэтому я думаю, что команда возвращает правильные имена, но не один раз ...

Я пробовал:

SELECT tblCustomers.LName
FROM tblCustomers, tblBookings
WHERE tblCustomers.CustID 
NOT IN (SELECT CustID FROM tblBookings)

Как мне просто вернуть один экземпляр имени, а не имя, повторяющееся 10 раз?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы выполняете CROSS JOIN двух таблиц. Используйте только НЕ В:

SELECT LName 
FROM tblCustomers 
WHERE CustID NOT IN (SELECT CustID FROM tblBookings)
1 голос
/ 18 июня 2020

(неявно) cross join в таблице бронирования во внешнем запросе не имеет смысла - и он умножает строки клиентов.

Кроме того, я бы рекомендовал not exists для фильтрации вместо not in : обычно он работает лучше - с правильным индексом на месте, и это null -безопасно:

SELECT c.LName 
FROM tblCustomers c
WHERE NOT EXISTS (SELECT 1 FROM tblBookings b WHERE b.CustID = c.CustID)

Для производительности убедитесь, что у вас есть индекс на tblBookings(CustID) - если у вас есть правильный объявлен внешний ключ, он уже должен быть там.

...