2016-07-17 7 views
0

У меня есть следующие таблицы:SQL несколько подзапросов в ИНЕКЕ

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') 

I Я пытаюсь выбрать address_components строку «001», потому что я пытаюсь получить строки, которые имеют как атрибутные записи «lot = 546», так и SubDiv = Avondale Spring ». Не все, но оба атрибута должны существовать.

Запрос не возвращает совпадений; однако, когда я запрашиваю использование одного подзапроса (исключая 1 из 2 подзапросов), запрошенные строки возвращаются для этого одного запроса.

+1

[Плохие привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad -habits-to-kick-using-old-style-joins.aspx) - этот стиль таблиц * в стиле старого стиля * с запятой был заменен на синтаксис * надлежащего * ANSI 'JOIN' в ANSI - ** 92 ** Стандарт SQL (** более 20 лет ** назад) и его использование не рекомендуется –

+1

Какая эта СУБД? Добавьте тег, чтобы указать, используете ли вы '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 | Лот | Avondale Spring || 001 | SubDiv | 546'? @ Ответ Гордона Линоффа лучше. –

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' 
      ); 
Смежные вопросы