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

时间:2014-02-14 23:48:23

标签: sql postgresql join natural-join

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)

然而,我的印象是,实现这一目标的方式较为简洁。

2 个答案:

答案 0 :(得分:26)

有一个NATURAL JOIN

SELECT *
FROM subscription NATURAL JOIN delivery

引用the manual on SELECT

  

NATURAL

     

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

它适用于您的测试设置,但它并不严格按照您的要求进行。该连接基于共享相同名称的所有列。不考虑外键。

简化代码/更简洁

对于初学者,您可以使用表别名,并且在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 ...

答案 1 :(得分:1)

delivery是否有两列代表外键?然后它应该像非复合主键SELECT * FROM subscription JOIN delivery ON (delivery.magazine_id = subscription.magazine_id AND delivery.user_id = subscription.user_id)一样工作。