我最近一直在学习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
的两列。
但是这样的东西应该是有效的(假设maker
是Product
中的一列,speed
是PC
中的一列,并且两个表都包含一个名为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 应该是可以单独执行的有效语句。
我强烈建议您限定查询中的所有列引用,如上例所示,以避免不明确的列错误。