2012-06-20 4 views
2

두 테이블 Foo 및 Bar가 있다고 가정합니다. Foos와 Bars 사이의 다 대다 관계에 대한 연관 테이블 Foo_Bar가 있습니다.쿼리에서 SQL 동적

이제 기본적으로 바 제약 조건의 동적 번호와 일치하는 Foos를 선택하는 쿼리가 필요합니다. 적절한 수의 조인을 사용하여 동적으로 쿼리를 생성하면됩니다.

SELECT * 
FROM Foo F INNER JOIN 
    Foo_Bar FB1 ON FB1.FooId = F.Id AND FB1.BarId= Y INNER JOIN 
    Foo_Bar FB2 ON FB2.FooId = F.Id AND FB2.BarId= Z INNER JOIN 
    --one inner join for each constraint 

더 간단한 방법이 있는지 궁금합니다. 나는 기본적으로이 같은 쿼리 원하는 : 유효한 SQL 아니다 물론

SELECT * 
FROM Foo F 
WHERE (Y, Z, ...) IN (SELECT BarId FROM Foo_Bar WHERE FooId = F.Id) 

을하지만, 동적 쿼리가 원하는 결과를 얻을 수있는 유일한 합리적으로 휴대용 방법 있는지 궁금 하군요.

+1

'FB1.FooId = F.Id ON Foo_Bar FB1 가입 FB1.BarId IN (Y, Z :

여기 당신의 테이블에 번역 "어윈 1" 쿼리입니다 ....)' – Lamak

+0

아닙니다. 아래 Dancrumb에 대한 회신을보십시오. – naasking

답변

1

을 나는 당신이 관계형 분할 쿼리를 원하는 가정합니다. 이 작업을 수행하는 방법은 많은이 질문을 참조 : How to filter SQL results in a has-many-through relation

도 (Postrgres에 대한) @ 어윈의 대답에 성능 테스트가 있습니다 당신은 조인 많거나 많은 EXISTS 하위 쿼리 또는 여러 IN 하위 쿼리를 사용하여 (즉, 동적 방법을 알 수 있습니다) 변수 테이블 또는 목록만으로 정적 쿼리보다 빠르게 수행합니다.

서버에서 데이터를 테스트하십시오. 예를 들어, MySQL은 IN 하위 쿼리에서 약간의 성능 문제가 있으므로 JOIN 버전을 사용하면 성능이 향상 될 것으로 기대됩니다. 당신이 할 수있는

SELECT f.* 
FROM Foo f 
JOIN (
    SELECT FooId 
    FROM Foo_Bar 
    WHERE BarId IN (Y, Z, ...)    --- your list or table here 
    GROUP BY FooId 
    HAVING COUNT(*) = @N      --- the size of this list or table 
    ) fb ON fb.FooId = f.Id; 
+0

당신이 흥미를 끄는 스레드. 나는 동적 SQL 대신 간단한 매개 변수를 사용하여 이런 종류의 쿼리를 작성할 수있는 방법이 있어야한다고 확신했다. 나는 그 질문에 대해 철저하게 답변을했다고 생각한다. 감사합니다! – naasking

1

당신이 준 그 정보를 바탕으로, 다음 쿼리는 당신이 필요로하는 데이터를 얻을 것입니다 :

SELECT * 
FROM Foo F INNER JOIN 
    Foo_Bar FB ON FB1.FooId = F.Id 
WHERE FB.BarId IN (Y, Z, ...) 
+0

제안 사항은 FB.BarId가 Z 또는 Y 인 모든 레코드와 일치합니다. 또는 ... FB.BarId가 Z 및 Y 인 F의 모든 레코드를 원합니다. 그리고 기본적으로 제공 한 쿼리의 이중입니다. – naasking