gpt4 book ai didi

sql-server - 了解内部查询的不明确列名

转载 作者:行者123 更新时间:2023-12-03 18:44:12 25 4
gpt4 key购买 nike

今天我遇到了一个奇怪的查询,我认为它会失败,但它以一种意想不到的方式成功了。这是它的最小复制。

表格和数据:

CREATE TABLE Employee(ID int, Name varchar(max))
CREATE TABLE Engineer(ID int, Title varchar(max))
GO
INSERT INTO Employee(ID, Name) VALUES (1, 'Bobby')
INSERT INTO Employee(ID, Name) VALUES (2, 'Sue')

INSERT INTO Engineer(ID, Title) VALUES (1, 'Electrical Engineer')
INSERT INTO Engineer(ID, Title) VALUES (2, 'Network Engineer')

查询:

--Find all Engineers with same title as Bobby has
SELECT * FROM Engineer WHERE Title IN (select Title from Employee WHERE Name = 'Bobby')

这将返回 Engineer 表中的所有行(没想到,我以为它会失败)。请注意,上面的查询是不正确的。内部查询使用的列“Title”不存在于从(“Employee”)中选择的表中。所以它必须在外部查询中绑定(bind)来自 Engineer 的 Title 列值....它总是等于它自己所以我认为所有行都被返回。

如果我完全限定列名,我也可以强制执行它,但会按预期失败:

SELECT * FROM Engineer WHERE Title IN
(select Empl.Title from Employee Empl WHERE Name = 'Bobby')

失败并显示“无效的列名称‘标题’。”

显然,如果我要将 Title 列添加到 Employee 表,它会改用 Employee.Title 列值。

ALTER TABLE Employee ADD Title varchar(max)
GO
UPDATE Employee SET Title = 'Electrical Engineer' WHERE ID = 1
UPDATE Employee SET Title = 'Network Engineer' WHERE ID = 2

SELECT * FROM Engineer WHERE Title IN
(select Title from Employee WHERE Name = 'Bobby')

这只返回一行(如预期的那样)。

我有点理解这里发生的事情,我正在寻找一些文档的链接或一些关键字,它们可以帮助我阅读并完全理解它(甚至一些解释)。

最佳答案

当然失败了。 Employee 表中没有名为 Title 的列。在确实有效的查询中,它是一个子查询,因此它从工程师那里提取标题。

如果您养成使用两部分命名而不只是列名来引用列的习惯,则可以完全避免这种情况。

但是在您的查询中,您应该开始学习如何对所有内容使用联接而不是子查询。您的代码不会那么困惑。

关于sql-server - 了解内部查询的不明确列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com