繁体   English   中英

SQL从多个表中选择所有列

[英]SQL Select all columns from multiple tables

旧的试卷中的一个问题如下:

假设您有3个表格(CARDHOLDERS,CARDHOLDER_STATUS,ACCOUNTS)。 编写查询以带回数据的所有可能组合(叉积)。

现在我的猜测是查询将看起来像这样

SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS

我上面的查询会返回正确的结果,还是我完全迷路了?

以上一项是对的。 您也可以尝试

SELECT * FROM CARDHOLDERS cross apply  CARDHOLDER_STATUS cross apply ACCOUNTS

要么

SELECT * FROM CARDHOLDERS cross join  CARDHOLDER_STATUS cross join ACCOUNTS

是的,您是对的,这将为您产生交叉联接。

您也可以尝试使用此语法以获得相同的结果

SELECT * FROM CARDHOLDERS交叉加入CARDHOLDER_STATUS交叉加入ACCOUNTS

该查询确实将为所有持卡人和每个持卡人提供每种calhoderstatus状态以及每个持卡人+持卡人状态,然后它将获取每个帐户。
因此,如果您有2个持卡人,2个状态和10个帐户,则查询将返回2x2x10 = 40个结果。

通常,您不想要所有匹配的记录,而是想要相关的记录。
假设您删除了一个状态并且处于活动状态,那么每个持卡人将只有1个状态。
当前,您的查询将返回此内容(不包括所有数据,太多的输入工作;)):

持卡人1-状态已删除
持卡人1-状态有效
持卡人2-状态已删除
持卡人2-状态有效

如果现在将一个statusID添加到持卡人记录中,则可以通过编写如下查询来指定持卡人具有的状态:

SELECT * 
FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS
WHERE CARDHOLDERS.StatusID = CARDHOLDER_STATUS.ID



这将返回以下数据(可能是您需要的):
持卡人1-StatusID 1-状态有效
持卡人2-StatusID 2-状态已删除

是的,这是正确的。 但是,建议您使用关键字CROSS JOIN而不是逗号(就像您将写INNER JOIN,LEFT JOIN等一样)以明确您在做什么以及您是否故意这样做。

SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS;

在这里,读者可能会认为您忘记了WHERE子句或将其意外删除了,因此丢失在那里的表会不由自主地加入条件。

SELECT * FROM CARDHOLDERS CROSS JOIN CARDHOLDER_STATUS CROSS JOIN ACCOUNTS;

在这里,读者可以确定您确实想交叉连接表格,因为您明确地说过。

通常:切勿通过列出以逗号分隔的表格来加入表格。 这是二十年前过时的语法。 始终改用显式联接语法。 它不易出错,更易读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM