SQL - 为什么 AS 可以与 UNION 一起使用,但不能与 JOIN 一起使用?



我最近一直在学习SQL并从SQL-EX做练习。我试图绕开我的头,但无法找到信息的一件事是 AS 语句与 Union 相结合。

按照以下内容,我可以在执行 UNION 后将我的数据存储为"AS"a:

SELECT * FROM (SELECT MODEL, PRICE FROM PC
UNION
SELECT MODEL, PRICE FROM LAPTOP
UNION
SELECT MODEL, PRICE FROM PRINTER) AS A
WHERE A.MODEL IN (SELECT MODEL FROM PRODUCT WHERE MAKER = 'B')

但是,为什么以下可能?JOIN 不会创建一个我也可以命名为"AS"的数据集吗?

Select distinct maker from (SELECT *
FROM Product INNER JOIN 
PC ON PC.model = Product.model) as a
where a.speed > 450

感谢您的帮助!

问题是SELECT * FROM.您必须命名稍后要引用的列。

以下 SQL 应该可以解决问题(未经测试):

Select distinct a.maker from (SELECT speed, maker
FROM Product INNER JOIN 
PC ON PC.model = Product.model) a
where a.speed > 450;

这个问题问为什么有些事情是不可能的。 我怀疑问题实际上是"为什么数据库返回此特定错误?

如果这不适用于 Oracle,则AS关键字不是问题所在。(Oracle 不允许表别名使用AS关键字。对于其他数据库,AS关键字是可选的,不是必需的。

如果此问题报告数据库返回错误,我怀疑它返回了"重复列名"错误,这是由于内联视图中的SELECT *。这是一个问题的原因是它返回了两列名为model,一列来自 PC,一列来自产品。在视图中返回两列同名列(内联或存储)也是无效的。 这将是非法的:

SELECT ...
FROM ( SELECT pc.model
, pr.model
FROM ...
) v

因为内联视图 v 将尝试返回名为model的两列。

但是这样的东西应该是有效的(假设makerProduct中的一列,speedPC中的一列,并且两个表都包含一个名为model的列。

SELECT DISTINCT a.maker
FROM ( SELECT pr.maker
, pc.speed
, pr.model 
, pc.model AS pc_model
FROM Product pr
JOIN PC pc 
ON pc.model = pr.model
) a
WHERE a.speed > 450

请注意,不需要返回model列。显示它只是为了演示我们如何为表达式分配不同的列名,以便内联视图查询不会返回重复的列名。

如果此查询出现问题,请单独测试内联视图查询。(括号之间的 SELECT 应该是可以单独执行的有效语句。

我强烈建议您限定查询中的所有列引用,如上例所示,以避免不明确的列错误。

相关内容

最新更新