2012-04-19 3 views
0

내가 SQL 쿼리 다음 사양을 갖추고 있지만, 이것은 내가 원하는 걸 확실히되지 않습니다 : 내가해야 할 것은하위 쿼리 추가 - SQL 서버 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

공통 테이블 식 (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

왜냐하면 a.attribID = 'a'이고 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) 이상이어야합니다 (파티션 by imageID) Numattribs FROM attribs where attribs.attribID IN ('a', 'b')) 왼쪽 외부 조인 항목 a.ImageID = Items.ImageID where 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

Acutally, 내 나쁜 ... (attribID = 'a') AND (attribID = 'b')가 작동하지 않습니다 – shinya

+0

지금 나를 혼동합니다. 당신의 목표는 무엇입니까? (attribID = 'a') AND (attribID = 'b')는 결코 결과를 얻을 수 없습니다. 그리고 btw, 어쨌든 왜 이것을 나눌까요? – YvesR