2015-06-03 46 views
-3

我有一個表名稱測試兩列,即:「供應商名稱」和「產品名稱」。現在我想要只在「卡車」和「計算機」中處理的供應商名稱。如下所示,該查詢的結果應僅返回「Ajit」。 儘管Gaurav在'卡車'和'電腦'中也進行交易,但他也在'BC'進行交易,所以查詢結果應該只返回供應商名稱作爲Ajit!需要SQL,提供只提供電腦和卡車的供應商名稱列表

測試:

**SuppliarName**  **Product Name** 
Gaurav    Truck 
Ajit    Computer 
Rahul    Jhadu 
Gaurav    Computer 
Gaurav    BC 
Ajit    Truck 
+3

學校工作?你正在使用哪種dbms產品? (答案可能依賴於它...) – jarlh

+0

是的學校工作,雖然在任何dbms查詢將在這裏工作,這將是最好的,如果它是SQL服務器 – user3729220

+0

自我加入,不存在。 – jarlh

回答

1

我不會回答這個問題之前,OP會顯示他的努力,但對自我jarlh評論加入,不存在相信我可以證明這是可能的,只有這兩個選項中的一個:

自左連接:

SELECT DISTINCT t1.SuppliarName 
FROM Tbl t1 
LEFT JOIN Tbl t2 ON(t1.SuppliarName = t2.SuppliarName 
        AND t2.ProductName NOT IN('Truck', 'Computer')) 
WHERE t1.ProductName IN('Truck', 'Computer') 
AND t2.SuppliarName IS NULL; 

不存在:

SELECT DISTINCT t1.SuppliarName 
FROM Tbl t1 
WHERE t1.ProductName IN('Truck', 'Computer') 
AND NOT EXISTS(
    SELECT 1 
    FROM Tbl t2 
    WHERE t1.SuppliarName = t2.SuppliarName 
    AND t2.ProductName NOT IN('Truck', 'Computer') 
) 

see fiddle here.

更新我可能誤解了這個問題。如果要求是用於計算機和卡車由供應商來賣的話,三自聯接或自聯接與不存在將這樣的伎倆:

三重自聯接:

SELECT DISTINCT t1.SuppliarName 
FROM Tbl t1 
INNER JOIN Tbl t2 ON(t1.SuppliarName = t2.SuppliarName 
        AND t1.ProductName <> t2.ProductName) 
LEFT JOIN Tbl t3 ON(t1.SuppliarName = t3.SuppliarName 
        AND t3.ProductName NOT IN('Truck', 'Computer')) 
WHERE t1.ProductName ='Truck' 
AND t2.ProductName = 'Computer' 
AND t3.SuppliarName IS NULL; 

自聯接與不存在:

SELECT DISTINCT t1.SuppliarName 
FROM Tbl t1 
INNER JOIN Tbl t2 ON(t1.SuppliarName = t2.SuppliarName 
        AND t1.ProductName <> t2.ProductName) 
WHERE t1.ProductName ='Truck' 
AND t2.ProductName = 'Computer' 
AND NOT EXISTS (
    SELECT 1 
    FROM tbl t3 
    WHERE t3.SuppliarName = t1.SuppliarName 
    AND t3.ProductName NOT IN('Truck', 'Computer') 
) 

see fiddle here.

1
SELECT * FROM dbo.Table1 t1 
WHERE EXISTS (SELECT * FROM dbo.Table1 t2 
       WHERE t1.SuppliarName = t2.SuppliarName 
       AND t2.[Product Name] = 'Computer') 
AND EXISTS (SELECT * FROM dbo.Table1 t3 
       WHERE t1.SuppliarName = t3.SuppliarName 
       AND t3.[Product Name] = 'Truck') 
AND NOT EXISTS (SELECT * FROM dbo.Table1 t4 
       WHERE t1.SuppliarName = t4.SuppliarName 
       AND t4.[Product Name] NOT IN ('Computer', 'Truck')) 

http://sqlfiddle.com/#!6/fc6f9/1

+0

你已經結束了一個簡單的查詢。不需要簡單的左連接就可以滿足所有這些代碼。 –

+0

@ZoharPeled對於一個問題可能存在輕微的不確定性,但我明白供應商需要同時擁有計算機和卡車,而不需要其他任何東西,這可以通過其他方式完成,但並不簡單。 (你剛剛更新了你的答案,而我正在輸入:)) –

+1

其實,我的評論是在我認爲它至少應該是計算機和卡車之一的時候寫的。編輯我的答案後,我認爲你的建議和我的代碼複雜性沒有太大的區別。 sql server的優化器甚至可能爲我們提出的所有三個選項執行相同的執行計劃:-) –