Временные таблицы в запросе delphi - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь объединить это во временную таблицу.Вы видите неправильный синтаксис здесь?Когда я выполняю, это не показывает никаких проблем, но когда я пытаюсь обратиться к этому запросу, он говорит «недопустимое имя таблицы # Temp_trans_13» (я использую MSSQL).

select * into #temp_trans_13 from (
select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = :jahr
and   periode = 12
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = :jahr
and   periode = 13
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste

where
      Jahr = :jahr 
and   periode = 14
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999')t 

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Похоже, что весь запрос можно упростить до:


select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr
into #temp_trans_13 
from sap_SuSa_liste
where
      Jahr = :jahr
     and   periode in (12,13,14)
     and   buchungskreis = :bkr
     and   konto_nr between '200000' and '999999'

UNION возвращает различные значения, что означает, что даже если бы оптимизатор запросов SQL Server был достаточно умен, чтобы избежать выполнения N запросов, он бы все же необходимо отсортировать и сгруппировать данные для устранения дубликатов.

Если необходимо удалить дубликаты, можно добавить DISTINCT к предложению SELECT

Временные таблицы

Временные таблицы являются временными.Они существуют только на время одного соединения.Те, которые имеют один префикс #, видны только соединению, которое их создало.

Ошибка invalid table name #Temp_trans_13 может возникнуть только в том случае, если другой запрос попытается использовать эту таблицу и не сможет ее найти, либо потому, что она еще не была создана, либо потому, что она была создана вдругое соединение.

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

2 голосов
/ 20 сентября 2019

В такой ситуации мне полезно попробовать запрос, сводящий проблему к ее основам.

При использовании SSMS 2014 у меня есть Table1, состоящий из одного Intстолбец с именем ID.

Если я попытаюсь

select * into #mytemp from (select * from table1)

, я получу сообщение об ошибке

Сообщение 102, уровень 15, состояние 1, строка 1 Неверный синтаксисоколо ')'.

Я получаю то же сообщение об ошибке, если я пытаюсь

select ID from (select * from table1)

Однако, следуя примеру в разделе R.Используя производную таблицу из TransactSql документов этот запрос

select ID from (select * from table1) as derivedtable

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

Далее,выполнение

select * into #mytemp from (select * from table1) as derivedtable

выполняется правильно и дает ожидаемые результаты.

Таким образом, очевидно, что as xxxx делает различие между конструкцией (select ... from ...), которая не работает и не работает.

0 голосов
/ 20 сентября 2019

Это исправит ваши проблемы:

declare 
   @bkr varchar(10),
   @jahr int

set @bkr = :bkr
set @jahr = :jahr

select T.* 
into #temp_trans_13 
from     
(
select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = @jahr
and   periode = 12
and   buchungskreis = @bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = @jahr
and   periode = 13
and   buchungskreis = @bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste

where
      Jahr = @jahr 
and   periode = 14
and   buchungskreis = @bkr
and   konto_nr between '200000' and '999999'
) T
...