23
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);

但是,我的印象是有一种不那么冗长的方法来实现这一点。

4

2 回答 2

30

有一个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。

于 2014-02-15T01:06:25.140 回答
1

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

于 2014-02-15T00:57:58.663 回答