2017-05-25 34 views
1

以前已經問過很多次,但我無法理解以前的解決方案並將它們實現到我自己的查詢中。 (我非常仍然是一個SQL新手。)SQL - 根據另一個表中的限制結果,基於另一個表中的條件

我有以下查詢:

select * 
from **Product** prod 
inner JOIN 
**account** acct on prod.product_id = acct.product_id 
inner JOIN 
**client_account_relationship** car on acct.account_id = car.ACCOUNT_ID 
inner JOIN 
**client** cl on car.client_id = cl.client_id 
where prod.product_code != 'Producttype' 

我的表結構如下:

產品 - 該表包含客戶帳戶持有什麼樣的產品

賬戶 - 該表保存客戶持有

客戶帳戶的關係如何解釋 - 該表保存客戶之間的聯繫ND佔

客戶端 - 該表保存客戶

A產品將始終有一個帳戶,帳戶將永遠有一個客戶端/客戶關係,和客戶端/客戶的關係將始終有一個客戶端。

我想顯示所有不包含特定產品類型的客戶端。 I.e向我展示所有不持有ProductType1的客戶端。但是因爲客戶可以擁有許多不同的產品類型,所以我的查詢會向我顯示除我不包括的產品之外的所有產品,但客戶可能仍然持有排除的產品。

如何根據另一個表中設置的條件限制客戶端表的結果?

+1

你肯定是缺少幾個聯接,你映射在查詢所有的FKS? –

回答

0

使用NOT IN聲明。 Not in要求SQL特別排除那些product types符合條件的where條件sub query

select distinct car.client_id 
from **Product** prod 
inner JOIN 
**account** acct on prod.product_id = acct.product_id 
inner JOIN 
**client_account_relationship** car on acct.account_id = car.ACCOUNT_ID 
inner JOIN 
**client** cl on car.client_id = cl.client_id 
where car.client_id not in 
(select car.client_id 
from **Product** prod 
inner JOIN 
**account** acct on prod.product_id = acct.product_id 
inner JOIN 
**client_account_relationship** car on acct.account_id = car.ACCOUNT_ID 
inner JOIN 
**client** cl on car.client_id = cl.client_id 
where prod.product_code != 'ProductType1' 
) 
+0

這兩個解決方案都很完美,但第二個解決方案對我更有幫助,因爲它保持了連接數據的完整性,這是額外的字段信息所需的。我想我現在開始明白如何使用不存在和不使用英寸他們似乎都做同樣的事情,但是有一個理由,其中一個會比另一個更好使用? – Dekks

+0

我使用不是在大多數時間,因爲我直接引用該列,我不需要在聲明中,在我的經驗工作比不存在處理所有列 –

0

SQL作爲一種描述性語言的好處在於它可以很好地翻譯英文。您已經描述了您想要做的事情 - 找到所有沒有特定產品的客戶。轉換爲SQL,這將是[not] exists操作:

SELECT * 
FROM client c 
WHERE NOT EXISTS (SELECT * 
        FROM product p 
        JOIN account a ON p.product_id = a.product_id 
        JOIN client_account_relationship car ON 
          a.account_id = car.ACCOUNT_ID 
        WHERE car.client_id = c.client_id AND 
          p.product_code = 'Producttype') 
相關問題