Подзапрос SQL против путаницы в соединении - PullRequest
2 голосов
/ 12 января 2009

У меня есть база данных, которая находится в Access (вы можете получить ее текст ссылки ). Если я бегу

SELECT DISTINCT Spl.Spl_No, Spl.Spl_Name
FROM Spl INNER JOIN Del 
   ON Spl.Spl_No = Del.Spl_No
WHERE Del.Item_Name <> 'Compass'

В нем указаны имена поставщиков, которые никогда не поставляли компас. Однако вы можете предположительно сделать это с помощью подзапроса. До сих пор я и некоторые другие не смогли сделать это правильно.

Я подошел ближе к следующему, пока мы не добавили больше поставщиков, чем он перестал работать

SELECT SPL.SPL_Name
FROM SPL
LEFT JOIN DEL ON Del.SPL_No = SPL.SPL_No
WHERE (DEL.Item_Name<>"Compass") OR (DEL.Item_Name IS NULL)
GROUP BY SPL.SPL_Name
HAVING COUNT(DEL.SPL_No) = 0

Итак, вопрос: это возможно сделать с подзапросом.

Ответы [ 7 ]

3 голосов
/ 12 января 2009

Я думаю, я бы пошел на:

SELECT SELECT Spl_No, Spl_Name
FROM Spl
WHERE Spl_No NOT IN 
  (SELECT Spl_No FROM Del
   WHERE Item_Name = 'Compass')
2 голосов
/ 12 января 2009

Вы имеете в виду что-то подобное?

SELECT SPL.SPL_Name
FROM SPL
WHERE NOT SPL.SPL_no IN 
 (SELECT SPL_no FROM DEL WHERE DEL.Item_Name = "Compass") 
1 голос
/ 12 января 2009

Это довольно близко к тому, как бы вы сказали это по-английски

«Дайте мне поставщиков, которые не осуществили доставку Компасов».

Select [Stuff]
From Spl S
Where Not Exists
   (Select * From Del
    Where Spl_no = S.Spl_no 
       And Item_name  = 'Compass')

EDIT: Без Exists вы можете использовать Count (*) = 0

Select [Stuff]
From Spl S
Where 
   (Select Count(*) From Del
    Where Spl_no = S.Spl_no 
       And Item_name  = 'Compass') = 0
1 голос
/ 12 января 2009

Если есть доступ .....

SELECT SPL.SPL_Name ОТ SPL WHERE NOT EXISTS (ВЫБЕРИТЕ 1 ОТ DEL, ГДЕ Del.SPL_No = SPL.SPL_No И (DEL.Item_Name = 'Компас') )

1 голос
/ 12 января 2009
SELECT Spl_No
     , Spl_Name
  FROM Spl
 WHERE NOT EXISTS( SELECT *
                     FROM Del
                    WHERE Del.Spl_no = Spl.Spl_no
                      AND Item_name  = 'Compass' )
0 голосов
/ 12 января 2009

Это то, что вы ищете?

SELECT
   SPL.SPL_name
FROM
   SPL
WHERE
   SPL.SPL_No NOT IN
   (
      SELECT SPL_No FROM DEL WHERE DEL.Item_Name <> "Compass"
   )
0 голосов
/ 12 января 2009

Поставщики, которые никогда не доставляли компас:

SELECT Spl.Spl_No, Spl.Spl_Name
FROM Spl
LEFT JOIN Del ON Del.Spl_No = Spl.Spl_No AND Del.Item_Name = 'Compass'
WHERE Del.Item_Name IS NULL

и с использованием подзапроса:

SELECT Spl_No, Spl_Name
FROM Spl
WHERE Spl_No IN 
  (
    SELECT Spl_No
    FROM Del
    GROUP BY Spl_No, Item_Name
    WHERE Item_Name = 'Compass'
    HAVING COUNT(*) = 0
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...