Sql 查询中复合外键/主键列上的联接表

Sql 查询中复合外键/主键列上的联接表,sql,postgresql,join,natural-join,Sql,Postgresql,Join,Natural Join,对于特定订阅,什么是查询交付的好方法?有没有一种方法可以将列名分配给主键(杂志id、用户id)和相应的外键,以便我可以这样查询: CREATE TABLE subscription ( magazine_id bigint, user_id bigint, PRIMARY KEY (magazine_id, user_id) ); CREATE TABLE delivery ( magazine_id bigint, user_id bigint,

对于特定订阅,什么是查询交付的好方法?有没有一种方法可以将列名分配给
主键(杂志id、用户id)
和相应的外键,以便我可以这样查询:

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)
);
SELECT *
FROM subscription
JOIN delivery ON (delivery.subscription_fk = delivery.subscription_pk);
注:我可以这样写:

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)
);
SELECT *
FROM subscription
JOIN delivery ON (delivery.subscription_fk = delivery.subscription_pk);

然而,我的印象是,有一种不太详细的方法来实现这一点。

交付
不是有两列代表外键吗?然后,它应该像使用非复合主键一样从订阅中选择*(delivery.magazine\u id=subscription.magazine\u id和delivery.user\u id=subscription.user\u id)
存在一个
自然加入

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

NATURAL

NATURAL
是使用列表的
的缩写,该列表提及两个表中具有相同名称的所有列

它适用于您的测试设置,但它并没有严格按照您的要求执行。连接基于共享相同名称的所有列。不考虑外键。
NATURAL JOIN
是个好主意的情况很少

简化代码/减少冗长 对于初学者,您可以使用表别名,并且不需要在连接条件周围加上括号(与使用
不同):

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

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

没有自动基于外键约束进行联接的语法变体。您必须查询系统目录并动态构建SQL。

是的,我正在寻找一种编写方法,以减少查询的冗长程度。我的印象是这可能是done@alumns:我添加了更多的细节。为这个场景创建自定义类型有什么特别的好处吗?@IamIC:不知道你要做什么。你可以用细节开始一个新问题。你可以随时链接到这一个以获取上下文信息,也可以在这里留下评论。这是一个很好的答案,因为它显示了你如何做到这一点,但也明确指出,虽然它可能适用于给定的设置,但这并不是因为任何自动的FK魔法