为什么我可以引用在SQL查询中被修改的表

时间:2019-02-03 10:57:52

标签: sql sqlite

我对SQL还是很陌生,我对一些基本知识有疑问:

据我了解,在阅读Gruber书籍时,无法在“ FROM”语句以及子查询中使用正在修改的表。 所以,我有一张桌子:

snum |sname  |city     |comm
----------------------------
1001 |Peel   |London   |0.12
1002 |Serres |San Jose |0.13
1003 |Axelrod|New York |0.1
1004 |Motika |London   |0.11
1007 |Rifkin |Barcelona|0.15
1100 |Bianco |San Jose |0.14

和查询:

INSERT INTO SalespeopleCopy(sname, city, comm)
SELECT sname, city, comm FROM SalespeopleCopy seconddata
WHERE seconddata.city >= (Select MAX(city) from SalespeopleCopy);

表在执行后已更改:

snum |sname  |city     |comm
----------------------------
1001 |Peel   |London   |0.12
1002 |Serres |San Jose |0.13
1003 |Axelrod|New York |0.1
1004 |Motika |London   |0.11
1007 |Rifkin |Barcelona|0.15
1100 |Bianco |San Jose |0.14
1102 |Serres |San Jose |0.13 (new row)
1100 |Bianco |San Jose |0.14 (new row)

在第三行中,我引用“ FROM”句子中的SalespeopleCopy表。并且SalespeopleCopy正在同时修改。

这是SQLite(3)数据库的功能吗?还是我对基础知识不正确?

关于我正在阅读的书 这里有一个表名为“SJpeople” 我们希望将一些行插入到它。然后我们要先检查SJpeople表中是否存在当前行,然后再插入它。

引用:

“这将是更好,如果你能设法找出这些价值观已经插入到表中,你尝试之前做一遍,通过增加另一个子查询(使用运营商如存在,,<> ALL,等等上)到谓词。 不幸的是,为了做好这项工作,你需要参考SJpeople表本身在从这个新的子查询的条款,正如我们前面所说,你不能指的是所涉及的表(整体)在修改命令的任何子查询。”

1 个答案:

答案 0 :(得分:0)

我猜您执行的查询是:

INSERT INTO SalespeopleCopy(snum, sname, city, comm)
SELECT snum, sname, city, comm FROM SalespeopleCopy seconddata
WHERE seconddata.city >= (Select MAX(city) from SalespeopleCopy);

包括snum列,对吗?
者:

Select MAX(city) from SalespeopleCopy

您得到:

San Jose

所以:

SELECT snum, sname, city, comm FROM SalespeopleCopy seconddata
WHERE seconddata.city >= (Select MAX(city) from SalespeopleCopy)

您将获得2行:

1102 |Serres |San Jose |0.13
1100 |Bianco |San Jose |0.14

,并将这两行插入到表中。

在查询语句中,您引用了表SalespeopleCopy的名称3次。
第二个引用是 alias seconddata

FROM SalespeopleCopy seconddata

您也可以编写它:

FROM SalespeopleCopy AS seconddata

因此您要从SELECT行开始的表名将从seconddata开始
尽管它是同一张表,所以在WHERE部分中是这样的:

WHERE seconddata.city >= .... 

您所指的是哪个表的city不会引起混淆:

  • 插入行
  • 的表的city
  • 选择行的表的city

    这不仅是SQLite的功能,还是标准SQL