2011-03-27 2 views
28

정말 테이블에 걸쳐 SQL 쿼리에 대한 도움을 주시면 감사하겠습니다. 나는 이런 종류의 일이 끊임없이 요구된다는 것을 알고 있지만, 대답을 이해하기에 충분히 비슷한 질문을 찾을 수는 없습니다.SQL : 다른 테이블에서 조건과 일치하는 하나의 테이블 중에서 선택 하시겠습니까?

해당 태그가 table_B 인 행을 table_A에서 선택하고 싶습니다.
예를 들어, " 'chair'태그가 붙은 table_a의 행을 선택하면 table_C이 반환됩니다.

또한 idtable_a에서 유일하며 table_b에서는 고유하지 않습니다.

table_A:    table_B:     table_C: 

id object   id tag     id object 
1  lamp   1  furniture   3  stool 
2  table   2  furniture   4  bench 
3  stool   3  furniture 
4  bench   4  furniture 
        4  chair 
        3  chair 

또는 데이터를 구성하는 더 좋은 방법이 있습니까? 당신이 원하는 행

select 
    A.* 
from 
    table_A A 
where 
    A.id in (
     select B.id from table_B B where B.tag = 'chair' 
) 

또는 당신이 테이블을 조인 할 수 및 필터링 :

select 
    A.* 
from 
    table_A A 
inner join table_B B 
    on A.id = B.id 
where 
    B.tag = 'chair' 

당신은 모두 프로파일해야하고

답변

63

가장 간단한 해결책은을 선택 하위 상관 것 데이터 세트에서 어느 것이 더 빠르는지보십시오.

+0

@ rjschnorenberg의 제안은 스키마를 변경하는 편이 낫다면 좋습니다. 이 경우 두 개의 INNER JOIN 절을 사용하여 Items <> Item_Tags <> 태그 세 테이블을 조인합니다. –

+0

좋습니다. 매우 도움이됩니다. 나는 당신이 그런 조인 된 테이블에서 열을 필터링 할 수 있다는 것을 몰랐습니다. –

+0

실제로 조인 줄을 "inner join table_B B on A.ID = B.ID 및 B.tag = 'chair'"로 작성할 수도 있지만 필터를 WHERE에 두는 것을 선호합니다. –

2
select a.id, a.object 
from table_A a 
inner join table_B b on a.id=b.id 
where b.tag = 'chair'; 
7

링크 테이블을 사용하여 태그를 자체 테이블로 설정해야합니다.

items: 
id object 
1  lamp 
2  table 
3  stool 
4  bench 

tags: 
id  tag 
1  furniture 
2  chair 

items_tags: 
item_id tag_id 
1  1 
2  1 
3  1 
4  1 
3  2 
4  2 
+0

스키마를 제어한다고 가정 할 때 더 나은 대답입니다. 그렇지 않다면 두 개의 객체 테이블을 결합한 뷰를 작성하여이 답변에서 제시하는 것을 수행 할 수 있습니다. –