复杂的SQL查询连接两个表

时间:2014-04-30 21:24:33

标签: oracle sqlplus

问题: 给定两个表:TableA,TableB,其中TableA与TableB具有一对多的关系,我想检索TableB中的所有记录,其中搜索条件与TableB中的某个列匹配,并为唯一的TableA记录返回NULL相同的属性。

表结构:

表A

ID(Primary Key)      | Name          | City
1                    | ABX           | San Francisco
2                    | ASDF          | Oakland
3                    | FDFD          | New York
4                    | GFGF          | Austin
5                    | GFFFF         | San Francisco

表B

ATTR_ID              |Attr_Type      | Attr_Name            | Attr_Value
1                    | TableA        | Attr_1               | Attr_Value_1
2                    | TableD        | Attr_1               | Attr_Value_2
1                    | TableA        | Attr_2               | Attr_Value_3
3                    | TableA        | Attr_4               | Attr_Value_4
9                    | TableC        | Attr_2               | Attr_Value_5

表B包含attribtue名称和值,是跨多个表使用的公用表。每个表都由Attr_Type和ATTR_ID标识(它映射到不同表的ID) 例如,表A中ID为1的记录在表B中有两个属性,其中包含Attr_Names:Attr_1和Attr_2等等。

预期输出

ID                   | Name          | City             | TableB.Attr_Value
1                    | ABX           | San Francisco    | Attr_Value_1
2                    | ASDF          | Oakland          | Attr_Value_2
3                    | FDFD          | New York         | NULL
4                    | GFGF          | Austin           | NULL
5                    | GFFFF         | San Francisco    | NULL

搜索条件: 从表B中获取表A中包含ATTR_NAME Attr_1的每个记录的行。如果特定的TableA记录没有Attr_1,则返回null。

我的查询

select id, name, city,
    b.attr_value from table_A
    join table_B b on
    table_A.id =b.attr_id and b.attr_name='Attr_1'

2 个答案:

答案 0 :(得分:0)

我没有SQL服务器来测试命令,但你想要的是内/外连接查询。你可以做这样的事情

select id, name, city,
    b.attr_value from table_A
    join table_B b on
    table_A.id *= b.attr_id and b.attr_name *= 'Attr_1'

像这样的东西应该为你做的伎俩

答案 1 :(得分:0)

这是一个奇怪的数据结构。您需要left outer join,其中包含on子句中的条件:

select a.id, a.name, a.city, b.attr_value
from table_A a left join
     table_B b
     on a.id = b.attr_id and b.attr_name = 'Attr_1' and b.attr_type = 'TableA';

我添加了attr_type条件,因为这似乎是这个数据结构的逻辑。