2011-02-28 8 views
-1

안녕하세요. 쿼리 작성에 문제가 있습니다. 나는 약간 통보를받는 것이 아주 기쁠 것이다!SQL 쿼리의 WHERE 절에 많은 조건이 있습니다.

내 테이블을 TagObjects라고합니다. 5 개의 열을 가지고 있지만 문제의 중요한 3 가지는 tob_tag, tob_object 및 tob_objectType입니다.

쿼리로 달성해야하는 것은 다음과 같습니다. 쌍 (tob_object, tob_objectType)이 알려지지 않은 경우 모든 쌍이 공통으로 가지고있는 모든 tob_tag를 알아야합니다. 나는이 쿼리를 시도

는 (숫자는 예를 들어 있습니다) : 나는 동적으로 쿼리를 짓고 있어요 때문에

SELECT "TagsObjects"."tob_tag" 
FROM "TagsObjects" 
WHERE TRUE 
AND ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1) 
AND ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1) 
GROUP BY "TagsObjects"."tob_tag"; 

를 Where TRUE 것이있다. 이 쿼리는 한 쌍 (WHERE 절에서 AND)으로 작동합니다. 두 쌍 (예를 들어 위의 예제와 같이)으로 시도했을 때 행이 반환되지 않으며 데이터가 있습니다.

누군가 내가 뭘 잘못하고 있는지 또는이 방법을 알고 있다면 큰 도움이 될 것입니다!

PostgreSQL 9.0.1 사용.

+0

TRUE를 삭제하십시오. AND 대신 OR로 대안을 참여 시키십시오. 그리고 행의 시작 부분에 FROM, WHERE 및 GROUP BY와 같은 SQL 키워드를 넣으십시오. –

+0

@Jonathan, 형편없는 형식으로 나를 비난 할 수 있습니다. 나는 줄 바꿈을 추가했다. (SQL 조각은 처음에는 한 줄이었다.) 그러나 가장 좋은 장소에 추가하지 않았다. 나는 그것을 바로 잡을 것이다. –

+0

당신은 쿼리의 일부분에서 AND가 아닌 OR을 사용할 필요가 있습니다 ... 참과 ((..) OR (..) OR) .. – MatBailie

답변

1

무엇이 잘못되었는지 시작합시다. "TagsObjects". "tob_object"= 8 및 "TagsObjects". "tob_object"= 9. "TagsObjects". "tob_object"는 동시에 둘 다 될 수 없으므로 어떤 행도 반환 될 수 없습니다 .

그럼 어떻게해야합니까?

당신의 스펙에서 나는 ("TagsObjects". "tob_object", "TagsObjects". "tob_objectType") 여러 쌍의 필드가없는 것을 모았습니다. 각 쌍에 대해 반환되는 모든 행의 합집합을 만들려고합니다.

WITH matchingTagsObjects AS (
    SELECT "TagsObjects"."tob_tag" 
    FROM "TagsObjects" 
    WHERE ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1) 
    UNION ALL 
    SELECT "TagsObjects"."tob_tag" 
    FROM "TagsObjects" 
    WHERE ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1) 
) 
SELECT "TagsObjects"."tob_tag" 
FROM matchingTagsObjects 
GROUP BY "TagsObjects"."tob_tag"; 

명명 된 하위 쿼리 matchingTgsObjects는 쌍 (8,1) 및 (8,2)에 대해 발견 된 모든 tob_tags를 나열합니다. 실제 태그는 기본 쿼리에서 선택되고 distinct tob_tags는 you with solution과 같이 group by 절을 사용하여 선택됩니다. 그룹화가 주 쿼리에서 수행 되었기 때문에 UNION ALL을 사용했으며이 시점에서 하위 쿼리에서 중복 행을 제거 할 이유가 없었습니다. UNION ALL의 ALL을 제외하면이 작업을 수행 할 수 있습니다.

명명 된 하위 쿼리를 사용하는 대신 하위 부분에 직접 하위 쿼리를 포함 할 수도 있습니다.

WHERE (쌍 A와 일치) 또는 (쌍 B와 일치)와 같이 where 절에서 OR 조건을 사용하는 다른 방법이 있습니다. 제 동료의 동료는 사용 된 것을 본다면 탄도에 올 것입니다. 이런 종류의 시나리오에서 일치를 위해 OR가 필요할 때 실제 모델로 처리해야 할 일이있을 수 있음을 알립니다.

+0

이 부록에 추가로 제공하십시오. 당신은 결과물을 기대합니다. –

+0

명명 된 서브 쿼리는'tob_object' 또는'tob_objecttype'에 의해 쿼리를 병합함으로써보다 간결하게 만들 수 있습니다 : WHERE "TagsObjects". "tob_objecttype"= 1 AND "TagsObjects". "tob_object"IN (8,9)' –

2

당신의 선택 조항을 구축, 그들을

SELECT "TagsObjects을"이 패턴을 사용하여 않는다 "고 말했다. tob_tag"
을 "TagsObjects"FROM
WHERE FALSE
OR ("TagsObjects". "tob_object"= (8) AND "TagsObjects". "tob_objecttype"= 1)
OR ("TagsObjects". "tob_object"= 9 AND "TagsObjects". "tob_objecttype"= 1) "TagsObjects"BY
GROUP."tob_tag";

그러나, 어떤 조건이 모두 다음 목록에 OR TRUE를 추가하지 않습니다, 그래서

SELECT "TagsObjects"이됩니다. "tob_tag"만일 "TagsObjects"FROM

WHERE FALSE
OR TRUE
GROUP BY "TagsObjects". "tob_tag"; 이 부분 나는 모든 쌍 공통점이 모든 tob_tag을 알 필요가

에 관해서는

.

모두 8/1 및 9/1 (이상 조합)가 tob_tags을 원하는 경우

, 그럼 당신은 GROUP BY 및 HAVING 절을해야합니다.

SELECT "TagsObjects"."tob_tag" 
FROM "TagsObjects" 
WHERE FALSE 
OR ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1) 
OR ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1) 
GROUP BY "TagsObjects"."tob_tag" 
HAVING COUNT(*) = 2; 
관련 문제