2013-02-26 17 views
0

У меня есть ситуация, когда LEFT JOIN не идет достаточно далеко в том, что мне нужно выполнить. У меня есть таблица продуктов (Продукты с колонками ItemID, ProductName, Price) и таблица заказов (Заказы с колонками OrderNumber, ItemID, Quantity).SQL-список продуктов, которые еще не заказаны

Мне нужен запрос, чтобы вернуть все продукты из таблицы Products, которые в настоящее время не являются частью определенного заказа (например, перечислите все продукты, которые не являются частью OrderNumber 52).

В моем текущем запросе перечислены все продукты, но исключается продукция, которая является частью ЛЮБОГО номера заказа.

$query = "SELECT Products.ItemID, Products.ProductName 
FROM Products 
LEFT JOIN Orders 
ON Orders.ItemID = Products.ItemID 
WHERE Orders.ItemID IS NULL 
ORDER BY Products.ProductName"; 

ответ

1

Вы можете использовать анти-присоединиться к этой цели, например, так:

SELECT ItemID, ProductName 
FROM Products 
WHERE ItemID NOT IN (
    SELECT ItemID 
    FROM Orders 
    WHERE OrderID = X 
) 
ORDER BY ProductName 
+0

код антиобмена прост и эффективен. Спасибо за совет. – Sterve

0
SELECT Products.ItemID, Products.ProductName 
FROM Products 
WHERE Products.ItemID not in (select Orders.ItemID from Orders where Orders.OrderNumber = xxx) 
ORDER BY Products.ProductName 
0

Что вам нужно легко может быть достигнуто только путем добавления номера заказа в состоянии присоединиться:

SELECT Products.ItemID, Products.ProductName 
FROM Products 
LEFT JOIN Orders 
ON (Orders.ItemID = Products.ItemID AND OrderNumber = 52) 
WHERE Orders.ItemID IS NULL 
ORDER BY Products.ProductName 
Смежные вопросы