我对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表本身在从这个新的子查询的条款,正如我们前面所说,你不能指的是所涉及的表(整体)在修改命令的任何子查询。”
答案 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
列