查询关联表的外键

Posted

技术标签:

【中文标题】查询关联表的外键【英文标题】:Querying a foreign key on a association table 【发布时间】:2012-06-05 03:04:58 【问题描述】:

假设我有以下模型:

Customer(customer_id (PK), firstName, lastName, email)
Item(item_id (PK), name, description)
Orders(orders_id (PK), customer_id (FK), item_id (FK), promotion_id (FK)),
Promotion(promotion_id (PK), date, gift_id (FK))
Gift(gift_id (PK), name, description)

现在,假设我有以下要求:

检索所有客户的所有订单(未分组)的列表以及关联的商品和礼品的名称列。

困难的部分是关联表orders有一个一对多表(促销)的外键列,而他又拥有礼物的外键; 我有以下有效的查询,但我发现应该有一种比做很多这样的连接更优雅的方法来解决问题:

select concat(c.firstName, ' ', c.lastName) as customerName,
       i.name, g.name
from   customer as c
left join orders as o on c.customer_id = o.customer_id
inner join item as i on o.item_id = i.item_id
inner join promotion as p on o.promotion_id = p.promotion_id
inner join gift as g on p.gift_id = g.gift_id;

如何以更优雅的方式解决查询? 提前致谢!

【问题讨论】:

【参考方案1】:

我认为这非常优雅。连接非常优雅,但经常被误解。

【讨论】:

【参考方案2】:

你可以去掉INNER关键字,因为join默认是inner的,AS关键字是可选的;也因为你的列名在连接中是相同的,你可以简单地使用USING而不是ON

SELECT CONCAT_WS(' ', c.firstName, c.lastName) customerName,
       i.name, g.name
FROM   customer    c
  LEFT JOIN orders o USING (customer_id)
  JOIN item        i USING (item_id)
  JOIN promotion   p USING (promotion_id)
  JOIN gift        g USING (gift_id)

确实,如果这些是连接表中唯一具有相同名称的列,则可以更进一步并使用NATURAL 连接(尽管我不喜欢这样,因为它隐藏了架构更改时发生的情况):

SELECT CONCAT_WS(' ', c.firstName, c.lastName) customerName,
       i.name, g.name
FROM   customer            c
  NATURAL LEFT JOIN orders o
  NATURAL JOIN item        i
  NATURAL JOIN promotion   p
  NATURAL JOIN gift        g

【讨论】:

我更喜欢指定 INNER JOIN 而不仅仅是 JOIN,只是为了确认这是您真正想要的。

以上是关于查询关联表的外键的主要内容,如果未能解决你的问题,请参考以下文章

hive建立数据仓库 事实表的外键和维度表主键怎么关联 啥命令

MySQL 从一个表中获取由另一个表的外键关联的内容

mysql表中,表的外键关联自身主键,为啥插入不了数据?

多表查询

tp5常用函数

Jpa之关联对象(单向多对多)