0

次のSQLクエリがありますが、これは私が望むものではありません:

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 を使用しています

ありがとうございました

4

2 に答える 2

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

これにより、最初ImageIDに CTE のテーブルから を選択しdbo.Attribs、次にその結果セットをテーブルの結果と結合して、Itemsテーブルに結合します。

于 2012-04-20T04:46:41.483 に答える
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
于 2012-04-19T22:06:31.213 に答える