连接两个表的复杂 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 joinon 子句中的条件:

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 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中两个表的连接

SQL语句中两个表的连接

用于连接两个按连接逻辑排序的表的最佳 SQL 查询

基于最近时间戳连接两个表的 SQL 查询

SQL 查询 - 返回连接表的前两条记录的连接

sql 用union合并合并查询结果