微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 在查询中的复合外部/主键的列上连接表

CREATE TABLE subscription (
   magazine_id bigint,user_id     bigint,PRIMARY KEY (magazine_id,user_id)
)

CREATE TABLE delivery (
   magazine_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)

但是,我的印象是,实现这一点的方法不那么冗长.

解决方法

一个NATURAL JOIN:
SELECT *
FROM subscription NATURAL JOIN delivery

报价the manual on SELECT

NATURAL

NATURAL is shorthand for a USING list that mentions all columns in the two tables that have the same names.

它将适用于您的测试设置,但它不是严格执行您要求的.连接基于所有共享相同名称的列.不考虑外键.

简化代码/较少冗长

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

原文地址:https://www.jb51.cc/mssql/81396.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐