1

私は次のスキーマを持っています:

product: id , title
client: id, name
client_has_product:id, id_product, id_client, date.

特定のクライアントに属していないすべての製品のリストを取得したい。

私は次のクエリを実行しています:

SELECT DISTINCT product.id, product.title, client.id
FROM product,client
WHERE product.id NOT IN (
SELECT id_product FROM client_has_product WHERE id_client = 1)
GROUP BY product.id

問題は、client_has_productテーブルが空の場合、クエリは何も返さないが、client_has_productテーブルに1行でもある場合、クエリは機能することです。

誰かが私がここで何が欠けているのか、そして/またはなぜこれが起こっているのか説明してもらえますか?

4

2 に答える 2

1

ここで問題となるのは

WHERE product.id NOT IN (
SELECT id_product FROM client_has_produc WHERE id_client)

これは、次の場合に常にfalseを返すためです。

WHERE product.id NOT IN ( null )

また、交差のないこのテーブルの結合は、すべての行のペアを返します。

FROM product,client

また、同じ商品を持っているクライアントが2人以上いる場合でも、常に1つの商品が生産されます。

GROUP BY product.id

解決策は、joinすべてのテーブルでを実行してから、特定のクライアントを除外することです。

SELECT DISTINCT product.id, product.title, client.id
FROM product
LEFT JOIN client_has_produc ON product.id = client_has_produc.id_product
LEFT JOIN client ON client.id = client_has_produc.id_client
WHERE client_has_product.id_client <> 1
于 2012-10-17T11:34:40.367 に答える
1

NOT IN WITH JOINを置き換える必要があります。次に、次の例を示します。

/クエリではありません/

USE AdventureWorks;
GO
SELECT ProductID
FROM Production.Product
WHERE ProductID
NOT IN (
SELECT ProductID
FROM Production.WorkOrder);

/ JOINクエリ/:-

SELECT p.ProductID
FROM Production.Product p
LEFT JOIN Production.WorkOrder w ON p.ProductID = w.ProductID
WHERE w.ProductID IS NULL;

お役に立てば幸いです。

于 2012-10-17T11:34:48.470 に答える