[英]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.