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