旧试卷中的问题内容如下:
假设你有3张桌子(CARDHOLDERS,CARDHOLDER_STATUS,ACCOUNTS)。编写查询以恢复数据的所有可能组合(交叉产品)。
现在我的猜测是查询看起来像这样
SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS
我上面的查询会返回正确的结果,还是我完全丢失了?
答案 0 :(得分:1)
上面一个是正确的。 你也可以尝试
SELECT * FROM CARDHOLDERS cross apply CARDHOLDER_STATUS cross apply ACCOUNTS
或
SELECT * FROM CARDHOLDERS cross join CARDHOLDER_STATUS cross join ACCOUNTS
答案 1 :(得分:0)
是的,你是对的,这将为你产生交叉联接。
你也可以尝试这种语法来获得相同的结果
SELECT * FROM CARDHOLDERS 交叉加入CARDHOLDER_STATUS 交叉加入ACCOUNTS
答案 2 :(得分:0)
此查询确实会为所有持卡人和每位持卡人提供每个持卡人和每位持卡人+持卡人状态,然后它将获取每个帐户。
因此,如果您有2个持卡人,2个状态和10个账户,查询将返回2x2x10 = 40个结果。
通常您不希望所有匹配的记录,而是相关的记录
假设您已删除状态并激活状态,则每个持卡人只有1个状态。
目前您的查询将返回此信息(不包括所有数据,类型工作太多;)):
持卡人1 - 已删除状态
持卡人1 - 状态有效
持卡人2 - 已删除状态
持卡人2 - 状态有效
如果您现在向持卡人记录添加一个statusID,您可以通过编写查询来指定持卡人的状态:
SELECT *
FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS
WHERE CARDHOLDERS.StatusID = CARDHOLDER_STATUS.ID
这将返回以下数据(可能是您需要的):
持卡人1 - 状态ID 1 - 状态有效
持卡人2 - 状态ID 2 - 状态已删除
答案 3 :(得分:0)
是的,这是正确的。但是建议使用关键字CROSS JOIN而不是逗号(就像你要编写INNER JOIN,LEFT JOIN等)来清楚你正在做什么以及你是故意这样做的。
SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS;
在这里,读者可能会认为您忘记了WHERE子句或意外删除了它,因此丢失的表会不自觉地加入标准。
SELECT * FROM CARDHOLDERS CROSS JOIN CARDHOLDER_STATUS CROSS JOIN ACCOUNTS;
在这里,读者可以确定您实际上想要交叉加入表格,因为您明确地这样说。
作为一项规则:永远不要通过列出逗号分隔来连接表。这是二十年前废弃的语法。始终使用显式连接语法。它不容易出错,更具可读性。