Найти запись, если значение не существует? - PullRequest
2 голосов
/ 18 октября 2011

У меня проблема с запросом SQL.

Я хочу найти StatusID = 1 в таблице records, ЕСЛИ StatusID = 2 не существует.

Я пробовал запрос:

SELECT * FROM records AS A
   LEFT JOIN records AS B on B.StoreID = A.StoreID
WHERE A.StatusID = 1 AND B.StatusID != 2

Это все еще показывает результат, даже если StatusID = 2 существует.

Примечание: StoreID - это идентификатор ссылки в таблице записей.

Ответы [ 3 ]

7 голосов
/ 18 октября 2011

Вы хотите использовать NOT EXISTS:

SELECT * 
FROM records AS A
WHERE A.StatusID = 1 
AND NOT EXISTS (select B.StoreID 
                from records AS B 
                where B.StoreID = A.StoreIDB 
                and B.StatusID = 2)
0 голосов
/ 18 октября 2011

Вы по-прежнему видите результат, даже если StatusID = 2 существует, потому что вы используете LEFT JOIN, который, как вы помните, возвращает весь левый набор и все соответствующие записи из правого набора или NULL, где их нет существовать.

Мне кажется, самое простое решение - просто использовать INNER JOIN, поскольку для случаев LEFT JOIN вернет, что INNER JOIN не будет, StatusID не будет равен ни 1, ни 2.

Таким образом:

select * from records a
inner join records b
on b.storeid = a.storeid
where a.statusid = 1
and b.statusid <> 2
0 голосов
/ 18 октября 2011

Предполагая ненулевое поле StatusID (всегда заполнено):

SELECT * FROM records AS A
   LEFT JOIN records AS B 
    on B.StoreID = A.StoreID
     and B.StatusID = 2
WHERE A.StatusID = 1 AND B.StatusID IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...