2017-08-02 4 views
0

Wenn ich dieses Skript auf Sybase IQ:SQL Anywhere Fehler -824: Unzulässige Bezugnahme auf Korrelationsnamen Tabellenname

declare @YEAR int=2017 
declare @MON int=6 
declare @DAY int=7 

update MainTable 

set MainTable.Amount=(X.Number+Y.Number), 
    MainTable.Total=(X.Total+Y.Total) 

from (select 'Number'= count(*), 'Total'=case when SUM(T1_Total) is null then 0 else SUM(T1_Total) end 
     from Table1  
     where T1_Account_NO=MainTable.Account_NO 
     and [email protected] and [email protected] and [email protected]) X, 
    (select 'Number'= count(*), 'Total'=case when SUM(T2_TOTAL) is null then 0 else SUM(T2_TOTAL) end 
     from Table2 where T2_Account_NO = MainTable.Account_NO 
     and [email protected] and [email protected] and [email protected])Y 

where  [email protected] 
     and MainTable.MON = @MON 
     and [email protected] 

Ich habe einen Fehler wie folgt aus: "SQL Anywhere Fehler -824: Unzulässige Bezugnahme auf Korrelationsnamen MainTable "

Wie kann ich dieses Problem übertreffen?

Antwort

0

Haben Sie MainTable zum from Klausel versucht, indem zB:

update Maintable 
set ... 
from MainTable, 
     (select ...)X, 
     (select ...)Y 
where ... 


HINWEIS: I mit Sybase ASE arbeiten, die nicht 'externe' Korrelationsnamen nicht zulässt in abgeleiteten Tabellen referenziert werden, frage ich mich, ob SQLAnywhere eine ähnliche Einschränkung hat ...?

Was passiert, wenn man die MainTable schließen sich aus der Top-Ebene in der Abfrage ziehen, zB:

declare @YEAR int=2017 
declare @MON int=6 
declare @DAY int=7 

update MainTable 

set MainTable.Amount=(X.Number+Y.Number), 
    MainTable.Total=(X.Total+Y.Total) 

from (select T1_account_NO, 'Number'= count(*), 'Total'=case when SUM(T1_Total) is null then 0 else SUM(T1_Total) end 
     from Table1  
     where [email protected] and [email protected] and [email protected] 
     group by T1_Account_NO) X, 
    (select T2_Account_NO, 'Number'= count(*), 'Total'=case when SUM(T2_TOTAL) is null then 0 else SUM(T2_TOTAL) end 
     from Table2 where [email protected] and [email protected] and [email protected] 
     group by T2_Account_NO)Y 

where  [email protected] 
     and MainTable.MON = @MON 
     and [email protected] 
     and MainTable.Account_NO = X.T1_Account_NO 
     and MainTable.Account_NO = Y.T2_Account_NO 

Ein möglicher leistungsbezogene Nachteil wäre, wenn die abgeleitete Tabellen jetzt eine große Menge von erzeugen Datensätze, die nicht mit MainTable verknüpft werden (es sei denn, die SQLAnywhere-Abfrage-Engine kann die Abfrage irgendwie abflachen ...).


Wenn dies ein Problem von nicht erlaubt ‚externe‘ Korrelationsnamen in abgeleiteten Tabellen ist, eine andere (offensichtlich?) Lösung wäre, ein paar #temp Tabellen aus den Ergebnissen der MainTable mit Table1/Table2 Beitritt zu schaffen, Führen Sie dann das MainTable-Update als Join mit den #temp-Tabellen aus. [Die # temp-Tabellen möglicherweise indizieren, wenn die Datenvolumes groß genug sind, um die Indizes leistungsmäßig zu rechtfertigen.]

+0

Ja ich habe es versucht, der gleiche Fehler hat geworfen. –

+0

Hmmm, ich frage mich, ob SQLAnywhere wie ASE ist, da es keine korrelierten Namen unterstützt, die an abgeleitete Tabellen weitergegeben werden, dh die abgeleitete Tabelle darf keine externen Tabellen-/Ansichts-/Korrelationsnamen referenzieren. Wenn das der Fall ist, lass mich meine Antwort mit einer anderen Idee aktualisieren ... gib mir ein paar Minuten ... – markp

+0

danke für dich nützlichen Rat. –

0

Haben Sie versucht, der FROM-Klausel MainTable hinzuzufügen?

+0

Ja ich habe es versucht. –

0

ich übertreffen dieses Problem wie folgt aus:

declare @YEAR int=2017 
declare @MON int=6 
declare @DAY int=7 

update MainTable 
set MainTable.Amount= (X.Number), 
    MainTable.Total = (X.Total) 
from (select T1_Account_NO,'Number'= count(*), 'Total'=case when SUM(T1_Total) is null then 0 else SUM(T1_Total) end 
     from Table1  
     where [email protected] and [email protected] and [email protected] 
     group by T1_Account_NO) X, 
where X.T1_Account_NO=MainTable.Account_NO 
     and [email protected] 
     and MainTable.MON = @MON 
     and [email protected] 


update MainTable 
set MainTable.Amount= coalesce(MainTable.Amount,0)+(Y.Number), 
    MainTable.Total = coalesce(MainTable.Total,0)+(Y.Total) 
    (select T2_Account_NO,'Number'= count(*), 'Total'=case when SUM(T2_TOTAL) is null then 0 else SUM(T2_TOTAL) end 
     from Table2 
     where [email protected] and [email protected] and [email protected] 
     group by T2_Account_NO) Y 

where  [email protected] 
     and MainTable.MON = @MON 
     and [email protected] 
     and Y.T2_Account_NO = MainTable.Account_NO 

ich Update-Skript die beiden Teile getrennt haben.

Verwandte Themen