Вы просто ссылаетесь на таблицу как temp.<table>
или <table>
последнее, только если это уникальное имя таблицы.
Согласно: -
Если указано имя схемы, оно должно быть "main", "temp" или
имя прикрепленной базы данных. В этом случае новая таблица
создан в указанной базе данных. Если ключевое слово "TEMP" или "TEMPORARY"
происходит между «CREATE» и «TABLE», после чего создается новая таблица
в базе данных temp. Ошибочно указывать имя схемы и
ключевое слово TEMP или TEMPORARY, если имя схемы не является "temp". Если нет
имя схемы указано, а ключевое слово TEMP отсутствует, тогда
таблица создается в основной базе данных.
SQL как понял SQLite - CREATE TABLE
В следующем примере создаются 3 таблицы: -
- таблица1 с 3 столбцами в качестве постоянной таблицы.
- table1 временная копия постоянной таблицы1.
- temp_table еще одна временная копия постоянной таблицы1.
: -
DROP TABLE IF EXISTS temp.table1;
DROP TABLE IF EXISTS table1;
DROP TABLE IF EXISTS temp_table;
CREATE TABLE table1 (columnA INTEGER,columnB INTEGER, columnC INTEGER);
- При создании постоянной таблицы 1 она загружается 4 строками
: -
INSERT INTO table1 (columnA,columnB,columnC) VALUES
(1,5,20),
(2,7,21),
(3,8,80),
(4,3,63);
CREATE TEMP TABLE table1 AS select * from table1;;
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM table1;
- обе временные таблицы затем используются для объединения всех, чтобы в основном дублировать строки, но с индикатором исходной таблицы в качестве нового столбца from_table
- Не то чтобы использовались две формы обращения к временным таблицам.
temp.
и только имя таблицы.
- Последняя используется только в том случае, если временная таблица является уникальным именем таблицы.
: -
SELECT 'temp_table' AS from_table,* FROM temp_table
UNION ALL
SELECT 'temp.table1' as from_table,* FROM temp.table1;
Результат: -

Повторное добавление примера: -
CREATE TEMPORARY TABLE TEMP_TABLE1 AS
Select
L.ID,
SUM(L.cost)/2 as Costs,
from Table1 L
JOIN Table2 C on L.ID = C.ID
Where C.name = 'mike'
Group by L.ID
Select
Count(L.ID)
from Table1 L
JOIN TEMP_TABLE1 TT1 on L.ID = TT1.ID;
Where L.ID not in (TT1)
And Sum(L.Cost) > TT1.Costs
В этом примере есть несколько проблем, которые препятствуют неправильному использованию совокупности (закомментировано) следующих работ.
- Примечание для моего удобства я добавил
_
к именам таблиц.
: -
DROP TABLE IF EXISTS Table_1;
DROP TABLE IF EXISTS Table_2;
DROP TABLE If EXISTS temp.temp_table1;
CREATE TABLE Table_1 (ID INTEGER PRIMARY KEY, cost REAL);
CREATE TABLE Table_2 (ID INTEGER PRIMARY KEY, name TEXT);
INSERT INTO Table_1 (cost) VALUES (100.45),(56.78),(99.99);
INSERT INTO Table_2 (name) VALUES ('mike'),('mike'),('fred');
CREATE TEMP TABLE temp_table1 AS
SELECT L.ID,
sum(L.cost)/2 as Costs
FROM Table_1 L
JOIN Table_2 C ON L.ID = C.ID
WHERE C.name = 'mike'
GROUP BY L.ID;
SELECT
count(L.ID)
FROM Table_1 L
JOIN temp_table1 TT1 ON L.ID = TT1.[L.ID]
WHERE
L.ID NOT IN (TT1.[L.ID])
-- AND Sum(L.cost) > TT1.costs --<<<< misuse of aggregate
Проблемы связаны с именем столбца L.ID
, поэтому его необходимо заключить (правила здесь SQL как понятно SQLite - применимы ключевые слова SQLite ) [
и ]
были использованы выше.
- Конечно, вы можете обойти необходимость в корпусе, назвав колонку, используя
AS
e..g SELECT
L.ID AS lid, --<<<< AS lid ADDED
SUM(L.cost)/2 as Costs, ,.......
Добавление следующего может быть подходящим для предотвращения неправильного использования агрегатов: -
GROUP BY L.ID
HAVING sum(L.cost) > TT1.costs
Добавление следующего в конец скрипта: -
SELECT
count(L.ID), *
FROM Table_1 L
JOIN temp_table1 TT1 ON L.ID = TT1.[L.ID];
Результат: -
