我最近一直在学习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
感谢您的帮助!
答案 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
的两列。
但是这样的事情应该是有效的(假设maker
是Product
中的列而speed
是PC
中的列,并且两个表都包含名为{的列{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应该是一个可以单独执行的有效语句。)
我强烈建议您限定查询中的所有列引用,如上例所示,以避免模糊的列错误。