2

我有两个不同的表,它们的不同列如下:

CREATE TABLE T1(C1 INT)
CREATE TABLE T2(C2 INT)

每个程序员都知道,如果我们用错误的语法编写查询,查询编译器应该给我们一个错误。比如这个:

SELECT C1 FROM T2 
--ERROR: Invalid column name 'C1'.

但是如果我们使用这个错误的查询作为内部选择,不幸的是 SQL 会执行它:

SELECT * 
FROM T1
WHERE C1 IN (SELECT C1 FROM T2) 
--returns all rows of T1

并且以下错误查询也将执行并返回所有行T1

SELECT * 
FROM T1
WHERE EXISTS (SELECT C1 FROM T2) 
--returns all rows of T1

当我们使用这些错误的查询时,情况会变得更糟,UPDATE例如:

UPDATE T1
SET C1 = NULL
WHERE C1 IN (SELECT C1 FROM T2) 
--updates all rows of T1

现在,我想防止这个错误。我可以强迫我的数据库开发人员小心,但是有没有系统的方法来防止这个错误?

4

2 回答 2

6

听说过Correlated Subquery,您总是可以在子查询中引用外部查询列

我相信你一定见过这样的查询

SELECT * FROM T1 
WHERE EXISTS (SELECT 1 FROM T2 where t1.c1 = t2.c2) 

这里C1的列来自子句,你指的是T1这就是区别。这里没有BUGWhereSelect

于 2018-01-14T07:08:18.817 回答
5

有没有系统的方法来防止这个错误?

始终使用由两部分组成的名称 - [Table].[Column].

于 2018-01-14T07:18:16.957 回答