连接两个表的复杂 SQL 查询
Posted
技术标签:
【中文标题】连接两个表的复杂 SQL 查询【英文标题】:Complex SQL query to join two tables 【发布时间】:2014-04-30 21:24:32 【问题描述】:问题: 给定两个表: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 保存属性名称和值,是跨多个表使用的通用表。每个表由 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'
【问题讨论】:
哪种风格的 SQL? mysql、Oracle TSQL 还是其他? 【参考方案1】:这是一个奇怪的数据结构。您需要一个 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
条件,因为这似乎符合此数据结构的逻辑。
【讨论】:
【参考方案2】:我没有用于测试命令的 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'
这样的事情应该对你有用
【讨论】:
以上是关于连接两个表的复杂 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章