gpt4 book ai didi

sql - INSERT INTO 允许使用不存在的列进行 SELECT

转载 作者:行者123 更新时间:2023-12-02 08:17:45 24 4
gpt4 key购买 nike

执行以下操作时:

CREATE TABLE TableA
(
A1 INT,
A2 INT
)

INSERT INTO TableA (A1, A2) VALUES (1, 2), (3, 4);

CREATE TABLE #TempTable1 (ColumnA INT, ColumnB INT);
CREATE TABLE #TempTable2 (ColumnA INT, ColumnB INT);

INSERT INTO #TempTable1 (ColumnA, ColumnB) VALUES (1, 2);

INSERT INTO #TempTable2
SELECT A1, A2
FROM TableA
WHERE A1 IN (SELECT ColumnA FROM #TempTable1);

SELECT * FROM TableA;
SELECT * FROM #TempTable1;
SELECT * FROM #TempTable2;

结果如下:

TableA
A1 A2
1 2
3 4

#TempTable1
ColumnA ColumnB
1 2

#TempTable2
ColumnA ColumnB
1 2

但是,如果我更改 #TempTable2 插入语句,使其从 #TempTable1 中选择一个不存在的列 A1:

INSERT INTO #TempTable2
SELECT A1, A2
FROM TableA
WHERE A1 IN (SELECT A1 FROM #TempTable1);

然后#TempTable2 包含 TableA 中的所有数据:

ColumnA ColumnB
1 2
3 4

我想知道为什么执行 INSERT 语句不会产生错误,因为列 A1 在#TempTable1 中不存在。例如,如果我尝试添加以下语句:

SELECT A1 FROM #TempTable1;

我得到:

Invalid column name 'A1'.

最佳答案

它被称为关联子查询。在 Sub-Query

中引用外部查询列

A1 列是从外部查询(即 TableA)引用的。因此,当您一起执行查询时它可以正常工作,而当您单独执行时它不起作用

会被解释为

SELECT A1, A2
FROM TableA A
WHERE A1 IN (SELECT A.A1 -- Here check the alias A
FROM #TempTable1);

通常在使用EXISTS/NOT EXISTS 时,查询将在where 子句中进行关联。

select * from tableA A 
where exists (select 1 from tableB B
where A.Id = B.Id -- A.Id is referred from tableA
)

在您的示例中,它在 Select

中被引用

关于sql - INSERT INTO 允许使用不存在的列进行 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384976/

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