2012-04-19 88 views
0

我有以下SQL查詢,但是這並不完全是我想要的:添加子查詢 - SQL Server 2008的

SELECT 
    TOP (20) Attribs.ImageID AS ItemID 
FROM 
    Attribs 
LEFT OUTER JOIN 
    Items ON Attribs.ImageID = Items.ImageID 
WHERE 
    (attribID IN ('a','b','c','d','e')) 
    AND (deleted NOT IN (1,2)) 
    AND Attribs.attribID = 'a' AND Attribs.attribID = 'b' 
GROUP BY 
    Attribs.ImageID 
ORDER BY 
    COUNT(DISTINCT attribID) DESC 

我需要的是查詢

AND Attribs.attribID = 'a' AND Attribs.attribID = 'b' 

第一,然後將剩下WHERE子句基於上述查詢結果。

這是可能實現使用子查詢嗎?

我使用SQL Server 2008

謝謝

+0

如果我已經正確理解你的問題,我認爲這不會有什麼區別,哪個條件優先。 – deutschZuid 2012-04-19 22:03:16

+0

您的搜索條件相互矛盾。沒有記錄將具有「a」,「b」或「c」以及「123」或「456」(更不用說都是!)的attribID值。你能澄清你想要做什麼嗎? – 2012-04-19 22:31:11

+0

Joh,你說得對。我更新了示例查詢。我想要的是(在這種情況下)獲得'a'和'b'的結果,然後得到在(a,b,c,d,e)中具有最匹配的attribID的imageID。假設我有itemID 1-a,c,d itemID 2-a,b,c,itemID 3-a,b。在這種情況下,itemID 1不會被包含在結果中,儘管它具有最高的匹配性。 – shinya 2012-04-19 22:51:45

回答

0

我不完全贊成讓你爲什麼想這樣做一個查詢第一之前,其他的原因....但你可以使用公用表表達式(CTE) - 是這樣的:

;WITH FirstQuery AS 
(
    SELECT a.ImageId 
    FROM dbo.Attribs a 
    WHERE a.attribID = 'a' AND a.attribID = 'b' 
) 
SELECT 
    TOP (20) a.ImageID AS ItemID 
FROM 
    dbo.Attribs a 
INNER JOIN 
    FirstQuery fq ON a.ImageId = fq.ImageId 
LEFT OUTER JOIN 
    dbo.Items i ON a.ImageID = i.ImageID 
WHERE 
    (attribID IN ('a','b','c','d','e')) 
    AND (deleted NOT IN (1,2)) 
GROUP BY 
    a.ImageID 
ORDER BY 
    COUNT(DISTINCT attribID) DESC 

有了這個,你第一從CTE你dbo.Attribs表中選擇ImageID,然後加入該結果與表的結果集合並加入到Items表中。

+0

我想查詢,因爲WHERE a.attribID ='a'AND a.attribID ='b'是ImageID必須擁有的attribID。 (attribID IN('a','b','c','d','e'))是該條件並不適用於所有人,因爲它計算了其中有多少人適用於ImageID – shinya 2012-04-22 17:43:00

+0

此外,我意識到WHERE a.attribID ='a'AND a.attribID ='b'不起作用。它應該是SELECT ImageID,count(attribs.attribID)OVER(partition BY imageID)AS Numattribs FROM attribs WHERE attribs.attribID IN('a','b'))a LEFT OUTER JOIN項目ON a.ImageID = Items.ImageID在哪裏numattribs = 2。在我發佈問題之前,我應該抓住那個。 – shinya 2012-04-22 17:47:26

+0

它看起來像在上一篇文章中替換我的查詢,內部查詢「WITH FirstQuery AS」是我所需要的。你能告訴我爲什麼每個人都想知道爲什麼我想先查詢另一個嗎?這是一個壞主意嗎? – shinya 2012-04-22 18:01:25

0

你想這樣做的性能問題?因爲將其分開不會改變結果。

無論如何,你可以做到這一點,如:

SELECT TOP (20) rn_Attribs.ImageID AS ItemID 
FROM (SELECT * 
     FROM Attribs 
     WHERE Attribs.attribID = '123' AND Attribs.attribID = '456') rn_Attribs 
LEFT OUTER JOIN Items ON rn_Attribs.ImageID = Items.ImageID 
WHERE(attribID IN ('a','b','c')) 
    AND (deleted NOT IN (1,2)) 
GROUP BY rn_Attribs.ImageID 
ORDER BY COUNT(DISTINCT attribID) DESC 
+0

我已更改原始帖子(請參閱上面的評論)並嘗試了您的查詢,但我沒有收到任何結果。 – shinya 2012-04-19 23:57:32

+0

Acutally,my bad ...(attribID ='a')AND(attribID ='b')does not work – shinya 2012-04-20 00:14:02

+0

你現在迷惑了我。你的目標是什麼? (attribID ='a')AND(attribID ='b')永遠不會得到任何結果。順便說一句,爲什麼你想分裂呢? – YvesR 2012-04-20 02:15:31