一尘不染

在查询中连接组合外键/主键列上的表

sql

CREATE TABLE subscription (
   magazine_id bigint,
   user_id     bigint,
   PRIMARY KEY (magazine_id, user_id)
);

CREATE TABLE delivery (
   magazine_id bigint,
   user_id     bigint,
   FOREIGN KEY (subscription) REFERENCES subscription (magazine_id, user_id)
);

查询给定特定订阅的交付的一种好方法是什么?有没有一种方法可以将列名称分配给PRIMARY KEY (magazine_id, user_id)相应的外键,以便我可以像这样查询:

SELECT *
FROM subscription
JOIN delivery ON (delivery.subscription_fk = delivery.subscription_pk);

注意:我可以这样写:

SELECT *
FROM subscription
JOIN delivery ON (delivery.magazine_id = subscription.magazine_id
              AND delivery.user_id = subscription.user_id);

但是,我给人的印象是,实现这一目标的方式不太冗长。


阅读 185

收藏
2021-03-17

共1个答案

一尘不染

有一个NATURAL JOIN

SELECT *
FROM   subscription
NATURAL JOIN delivery;

引用以下手册SELECT

NATURAL

NATURALUSING表示两个表中具有相同名称的所有列的列表的简写。

它可以用于您的测试设置,但 并不是严格按照您的要求进行 。该连接基于共享相同名称的所有列。不考虑外键。其中,这些案件NATURAL JOIN是一个好主意是少之又少。

简化代码/减少冗长

对于初学者,您可以使用表别名,并且不需要在括号中加上ON(与USING)不同的括号:

SELECT *
FROM   subscription s
JOIN   delivery     d ON d.magazine_id = s.magazine_id
                     AND d.user_id = s.user_id;

由于联接条件中的列名相同,因此可以进一步简化USING

SELECT *
FROM   subscription s
JOIN   delivery     d USING (magazine_id, user_id);

没有语法变量会自动基于外键约束进行联接。您将不得不查询系统目录并动态构建SQL。

2021-03-17