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)相应的外键,以便我可以像这样查询:
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);
但是,我给人的印象是,实现这一目标的方式不太冗长。
有一个NATURAL JOIN:
NATURAL JOIN
SELECT * FROM subscription NATURAL JOIN delivery;
引用以下手册SELECT:
SELECT
NATURAL NATURAL是USING表示两个表中具有相同名称的所有列的列表的简写。
NATURAL
NATURAL是USING表示两个表中具有相同名称的所有列的列表的简写。
USING
它可以用于您的测试设置,但 并不是严格按照您的要求进行 。该连接基于共享相同名称的所有列。不考虑外键。其中,这些案件NATURAL JOIN是一个好主意是少之又少。
对于初学者,您可以使用表别名,并且不需要在括号中加上ON(与USING)不同的括号:
ON
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。