2016-04-07 14 views
0

ich auf einem Client-Abfrage kam gestern, ist es so etwas wie:Oracle SQL abgeleitete Tabelle - optional Aliasing

select count(*) as countall, 
      person, 
      location 
    from (select custid, 
       min("Date") as theDate, 
       person, 
       data.location 
     from data join 
      customer on customer.customerid = custid 
     where status = 1 
      and custid <> -1 
     group by custid, 
       person, 
       data.location) --[NO ALIAS] 
    group by person,location 

ich nicht viele Stunden in Oracle, aber in MS SQL wäre dies nicht fliegen , meines Wissens nach. Jedes Mal, wenn ich eine abgeleitete Tabelle verwendet habe, wird ein Fehler ausgegeben, sodass Szenarien wie diese mein Interesse wecken. Ich konnte nichts finden, um es auf den Interwebs zu erklären, hoffentlich kann jemand die Szenarien erklären, wo Aliasing für abgeleitete Tabellen optional ist und wenn nicht.

+0

Aliasing ist nicht erforderlich. Es ist jedoch erforderlich, wenn Sie darauf verweisen müssen. – mathguy

+1

Das wird funktionieren. Aliasing ist optional, wird aber empfohlen. In dem von Ihnen geposteten Code nicht unbedingt erforderlich, wird jedoch empfohlen, wenn es Tabellen außerhalb der Inline-Ansicht gibt, sodass Joins verwendet werden können. Dies ist erforderlich, wenn Spaltennamen häufig oder mehrdeutig sind. –

+1

Dies unterscheidet sich von Plattform zu Plattform. In Oracle Subselects (abgeleiteten Tabellen) benötigen Sie nicht, was Sie einen Alias ​​nennen (in der Tat heißt es _korrelation name_). Ich würde sagen, benutze sie immer als Best Practice. – mustaccio

Antwort

1

Sie müssen nur dann einen Aliasnamen angeben, wenn Sie auf eine Spalte verweisen, die nicht eindeutig definiert ist. Dies bedeutet, dass die Spalte in mehr als einer Tabelle/abgeleiteten Tabelle vorhanden ist. Eine Referenz könnte in der SELECT-Anweisung oder in einer Verknüpfung enthalten sein. Wenn alle Spalten eindeutig sind, benötigen Sie keinen Alias.

Ich bevorzuge Alias ​​die ganze Zeit für Klarheit, und weil es mit Intellisense in PL/SQL hilft.

--ALIAS needed, because the 'a' column referenced is not unique 
--this will throw an error 
select a, a, b, c 
    from (select 'A1' as a, 'B1' as b, 'C1' as c from dual), 
     (select 'A2' as a from dual); 
--this will not throw an error 
select t1.a, t2.a, b,c 
    from (select 'A1' as a, 'B1' as b, 'C1' as c from dual) t1, 
     (select 'A2' as a from dual) t2; 
; 

--ALIAS not needed for join, because all referenced columns are unique 
select a, b, c, d, e, f 
    from (select 'A' as a, 'B' as b, 'C' as c from dual) 
    join (select 'D' as d, 'E' as e, 'F' as f from dual) 
    on a = d; 

--ALIAS needed for join, because the 'x' column referenced is not unique 
--this will throw an error 
select a 
    from (select 'A' as a, 'B' as b, 'C' as c, 'X' as x from dual) 
    join (select 'D' as d, 'E' as e, 'F' as f, 'X' as x from dual) 
    on x = x; 
--this will not throw an error 
select a 
    from (select 'A' as a, 'B' as b, 'C' as c, 'X' as x from dual) t1 
    join (select 'D' as d, 'E' as e, 'F' as f, 'X' as x from dual) t2 
    on t1.x = t2.x; 
1

In diesem Fall wählen Sie alle Spalten aus Ihrer Unterabfrage aus und daher wurde die Unterabfrage ohne Alias ​​geschrieben.

Wenn Sie diese Unterabfrage mit einer anderen Tabelle oder einer anderen Unterabfrage verknüpfen möchten, sollten Sie einen Aliasnamen verwenden, damit Sie die Joinspalten mithilfe des definierten Alias ​​referenzieren können.