Я пытаюсь перечислить все товары, по которым не было продаж. Я действительно близок, но я пытаюсь использовать оператор NOT EXISTS для отображения всех ProductID, которые находятся в таблице Product, но не в таблице Orderline; и, следовательно, не имеют продаж. Мой код выглядит следующим образом:

SELECT product.productid
FROM product
JOIN orderline ON product.productid = orderline.productid
WHERE NOT EXISTS (

SELECT orderline.productid
FROM orderline
)
ORDER BY productid
0
user3558008 22 Апр 2014 в 00:55

3 ответа

Лучший ответ

Вы можете избежать подвыбора, просто выполнив LEFT JOIN:

SELECT product.productid
FROM product
LEFT JOIN orderline USING (productid)
WHERE orderline.productid IS NULL
ORDER BY product.productid

LEFT JOIN перечислит все строки в product, даже если в orderline нет партнера JOIN. В этом случае все столбцы в orderline имеют значения NULL. Это те строки, которые вы хотите получить в результате.

0
theHacker 21 Апр 2014 в 21:00

Если вам необходимо использовать not exists, попробуйте следующее:

SELECT *
FROM product p
WHERE NOT EXISTS (
        SELECT 1
        FROM orderline o
        WHERE p.productid = o.productid
        )
ORDER BY p.productid
2
Andreas 21 Апр 2014 в 21:00

Если вы хотите получить продукты, которых нет в таблице заказа, вы можете просто использовать ЛЕВОЕ соединение с WHERE orderline.productid IS NULL, нет необходимости использовать NOT EXISTS, использование левого соединения предоставит вам все данные из таблицы продуктов и выдает пустую строку, если продукт не существует в таблице заказа

SELECT p.productid
FROM product p
LEFT JOIN orderline o ON p.productid = o.productid
WHERE o.productid IS NULL
ORDER BY p.productid
1
M Khalid Junaid 21 Апр 2014 в 20:57