SQL - 为什么AS与UNION一起工作但不是JOIN?

时间:2016-06-20 15:52:26

标签: sql join union

我最近一直在学习SQL并从SQL-EX做练习。我试图解决的一件事是无法找到相关信息的是AS声明与UNION的结合。

根据以下内容,我可以在执行UNION之后将数据存储为“AS”:

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”a?

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

问题是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;

答案 1 :(得分:0)

这个问题询问为什么有些事情是不可能的。我怀疑问题是“为什么数据库会返回此特定错误?”。

如果不适用于Oracle,则AS关键字不是问题。 (Oracle禁止表别名的AS关键字。对于其他数据库,AS关键字是可选的,不是必需的。)

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

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

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

但是这样的事情应该是有效的(假设makerProduct中的列而speedPC中的列,并且两个表都包含名为{的列{1}}。

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 列。这只是为了演示如何为表达式分配不同的列名,以便内联视图查询不返回重复的列名。

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

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