Почему я могу ссылаться на таблицу, изменяемую в запросе SQL - PullRequest
0 голосов
/ 03 февраля 2019

Я довольно новичок в SQL, и у меня есть вопрос о некоторых основах:

Как я понимаю, читая книгу Грубера, невозможно использовать изменяемую таблицу в предложении "ОТ", а такжев подзапросе.Итак, у меня есть таблица:

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)

В третьей строке яссылка на таблицу SalespeopleCopy, которая находится в предложении «ОТ».И SalespeopleCopy изменяется одновременно.

Это особенность базы данных SQLite (3)?Или я не правильно понимаю основы?

О книге, которую я читаю. Есть таблица с именем "SJpeople". Мы хотим вставить в нее несколько строк.И мы хотим проверить, существует ли текущая строка в таблице SJpeople перед ее вставкой.

цитата:

"Было бы лучше, если бы вы как-то узнали, чтоэти значения уже были вставлены в таблицу, прежде чем вы попытаетесь сделать это снова, добавив еще один подзапрос (используя операторы, такие как EXISTS, IN, <> ALL и т. д.) к предикату. К сожалению, для выполнения этой работы,вам нужно будет сослаться на саму таблицу SJpeople в предложении FROM этого нового подзапроса, и, как мы говорили ранее, вы не можете ссылаться на таблицу, которая участвует (полностью) в любом подзапросе команды модификации. "

1 Ответ

0 голосов
/ 03 февраля 2019

Я думаю, что вы выполнили запрос:

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

иэти 2 строки вставляются в таблицу.В заявлении вашего запроса вы ссылаетесь на название таблицы SalespeopleCopy 3 раза.Вторая ссылка: с псевдонимом до seconddata:

FROM SalespeopleCopy seconddata

Вы также можете написать это:

FROM SalespeopleCopy AS seconddata

так имя таблицы, из которой вы хотите SELECT строк будет теперь seconddataхотя это та же самая таблица, и поэтому в WHERE части:

WHERE seconddata.city >= .... 

нет никакой путаницы, к какой таблице city вы относитесь:

  • the city столбец таблицы, где строки вставлены в или
  • столбец city таблицы, в которой строки выбраны из Это не только функция SQLite, это стандартный SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...