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)
然而,我的印象是,实现这一目标的方式较为简洁。
答案 0 :(得分:26)
有一个NATURAL JOIN
:
SELECT *
FROM subscription NATURAL JOIN delivery
NATURAL
NATURAL
是USING
列表的简写,提及两个表中具有相同名称的所有列。
它适用于您的测试设置,但它并不严格按照您的要求进行。该连接基于共享相同名称的所有列。不考虑外键。
对于初学者,您可以使用表别名,并且在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)
一样工作。