2012-04-19 33 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

+0

あなたの検索語は矛盾しています。レコードにはattribIDの値が "a"、 "b"、 "c"のいずれかであり、 "123"または "456"(両方とも!あなたがしようとしていることを明確にすることはできますか? –

+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

答えて

0

私は完全にあなたが他の前最初この1つのクエリを実行したい理由が届かない....しかし、あなたが使用することができます共通テーブル式(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

+0

また、 WHERE a.attribID = 'a' AND a.attribID = 'b'は機能しません。これはSELECT ImageID、count(attribs.attribID)OVER(パーティションBY画像ID)AS Numattribs FROM attribs where attribs.attribID IN( 'a'、 'b'))LEFT OUTER JOINアイテムa.ImageID = Items.ImageIDどこnumattribs = 2。私は質問を投稿する前にそれをキャッチした必要があります。 – shinya

+0

「WITH FirstQuery AS」内のクエリで以前の投稿のクエリを置き換えるように見えます。私は誰がなぜ私が最初に他のものに問い合わせるのかと不思議に思う理由を教えてください。それは悪い考えですか? – shinya

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

+0

私の悪い...(attribID = 'a')AND(attribID = 'b')はうまくいきません – shinya

+0

あなたは今私を混乱させます。あなたの目標は何ですか? (attribID = 'a')AND(attribID = 'b')は結果を得ることができません。とbtw、なぜあなたはこれをとにかく分割したいですか? – YvesR