SQLITE, создай временную таблицу и выбери из нее - PullRequest
0 голосов
/ 30 апреля 2018

просто интересно, как я могу создать временную таблицу и затем выбрать из нее дальше вниз по сценарию.

Пример.

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

В идеале я хочу иметь временную таблицу, а затем использовать ее в сценарии для ссылки.

Любая помощь будет отличной!

1 Ответ

0 голосов
/ 30 апреля 2018

Вы просто ссылаетесь на таблицу как temp.<table> или <table> последнее, только если это уникальное имя таблицы.

Согласно: -

Если указано имя схемы, оно должно быть "main", "temp" или имя прикрепленной базы данных. В этом случае новая таблица создан в указанной базе данных. Если ключевое слово "TEMP" или "TEMPORARY" происходит между «CREATE» и «TABLE», после чего создается новая таблица в базе данных temp. Ошибочно указывать имя схемы и ключевое слово TEMP или TEMPORARY, если имя схемы не является "temp". Если нет имя схемы указано, а ключевое слово TEMP отсутствует, тогда таблица создается в основной базе данных.

SQL как понял SQLite - CREATE TABLE

В следующем примере создаются 3 таблицы: -

  1. таблица1 с 3 столбцами в качестве постоянной таблицы.
  2. table1 временная копия постоянной таблицы1.
  3. 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. При создании постоянной таблицы 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;
  1. обе временные таблицы затем используются для объединения всех, чтобы в основном дублировать строки, но с индикатором исходной таблицы в качестве нового столбца from_table
    1. Не то чтобы использовались две формы обращения к временным таблицам. temp. и только имя таблицы.
    2. Последняя используется только в том случае, если временная таблица является уникальным именем таблицы.

: -

SELECT 'temp_table' AS from_table,* FROM temp_table
UNION ALL 
SELECT 'temp.table1' as from_table,* FROM temp.table1;

Результат: -

enter image description here


Повторное добавление примера: -

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];

Результат: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...