2016-07-17 223 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') 

I a m試圖選擇address_components行「001」,因爲我試圖檢索同時具有「lot = 546」和SubDiv = Avondale Spring「屬性條目的行。不是,但兩個屬性都必須存在。

查詢返回無匹配;但是,當我使用單個子查詢(排除2個子查詢中的1個)查詢時,所請求的行將針對該單個查詢返回。

+1

[不良習慣踢:使用舊樣式的JOIN(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad -habits-to-kick-using-old-style-joins.aspx) - 在ANSI-** 92中,舊式*逗號分隔的表*樣式列表被替換爲* proper * ANSI'JOIN'語法** 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 | Lot | Avondale Spring || 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' 
      );