2016-07-17 3 views
0
나는 다음과 같은 테이블이

:SQL 여러 하위 쿼리 WHERE 절

address_components (테이블)

ADDRESS_ID  STREET_NUMBER   STREET_NAME 
----------------------------------------------------- 
001    1402      Motz 
002    505      31st 
003    4100      Stimmel 

속성 (테이블)

ID    ATTRIBUTE_DEFINITION_ID   VALUE 
---------------------------------------------------------------- 
001    Lot        546 
001    SubDiv       Avondale Spring 
002    Lot        546 
002    SubDiv       Garden 
003    Lot        131 
003    SubDiv       Avondale Spring 

그리고 다음과 같은 SQL 문 :

SELECT 
    street_number,street_name 
FROM 
    address_components a, attributes attr 
WHERE 
    a.address_id = attr.id 
    AND EXISTS (SELECT 1 FROM attributes 
       WHERE attr.attribute_definition_id = 'Lot' 
        AND attr.value = '546') 
    AND EXISTS (SELECT 1 FROM attributes 
       WHERE attr.attribute_definition_id = 'SubDiv' 
        AND attr.value = 'Avondale spring') 

a "lot = 546"및 SubDiv = Avondale Spring "이라는 두 속성 항목이있는 행을 검색하려고하기 때문에 address_components 행"001 "을 선택하려고했습니다. 둘 중 하나의 속성이 존재해야합니다.

쿼리가 일치하는 항목을 반환하지 않습니다. 그러나 하나의 하위 쿼리 (2 개의 하위 쿼리 중 1 개를 제거)를 사용하여 쿼리를 수행하면 해당 단일 쿼리에 대해 요청 된 행이 반환됩니다.

+1

: 당신은 상관 하위 쿼리하려면 [걷어차 나쁜 습관 : 이전 스타일을 사용하여 조인 (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad 오래된 스타일의 쉼표로 구분 된 테이블 * 스타일 목록이 ANSI에서 * 적절한 * ANSI'JOIN' 구문으로 바뀌 었습니다 - ** 92 ** SQL 표준 (** 20 년 전 **) 및 그 사용은 권장하지 않습니다 –

+1

어느 RDBMS입니까? 태그를 추가하여 mysql, postgresql, sql-server, oracle 또는 db2 중 어느 것을 사용하는지 지정하십시오. –

답변

0
SELECT top 1 a.street_number,a.street_name from address_components a 
       inner join attributes k on a.ADDRESS_ID=k.ID 
       WHERE k.ATTRIBUTE_DEFINITION_ID in('Lot','SubDiv') AND 
       k.value in('546','Avondale Spring') 
+0

행이 '001 | 로트 | 아본 데일 스프링 || 001 | SubDiv | 546'? @ GordonLinoff의 대답이 더 좋습니다. –

1

쿼리의 아이디어가 좋습니다. 그러나 from 절에 두 개의 테이블이 필요하지 않습니다.

SELECT a.street_number, a.street_name 
FROM address_components a 
WHERE EXISTS (SELECT 1 
       FROM attributes attr 
       WHERE a.address_id = attr.id AND attr.attribute_definition_id = 'Lot' AND attr.value = '546' 
      ) AND 
     EXISTS (SELECT 1 
       FROM attributes attr 
       WHERE a.address_id = attr.id AND attr.attribute_definition_id = 'SubDiv' AND attr.value = 'Avondale spring' 
      );