2017-11-30 8 views
1

Betrachten Sie die Tabelle table1 und seine entsprechende Lookup-Tabelle table2:MySQL: LEFT + JOIN Alias ​​

`table1` 
a b 
1 11 
2 22 
3 33 
4 44 
5 55 

`table2` 
b c 
11 111 
22 222 
33 333 
44 444 
55 555 

Sie eine Lookup zwischen table1 und table2 mit der folgenden Abfrage durchführen kann:

SELECT `table1`.`a`, `table1`.`b`, `table2`.`c` 
FROM `table1` 
LEFT JOIN `table2` 
ON `table1`.`b` = `table2`.`b` 

Welche würden korrekte Eingabe des Ergebnisses:

a b c 
1 11 111 
2 22 222 
3 33 333 
4 44 444 
5 55 555 

Problem
Angenommen, Sie benötigen aus irgendeinem Grund einen Alias ​​für die Spalte b (Beispiel: Berechnung einiger Funktionen). Instinktiv können Sie versuchen, die folgende Abfrage ausführen:

SELECT `table1`.`a`, ABS(`table1`.`b`) as tb, `table2`.`c` 
FROM `table1` 
LEFT JOIN `table2` 
ON tb = `table2`.`b` 

Allerdings würde MySQL sagte:

#1054 - Unknown column 'tb' in 'on clause' 

Frage
Was oben in der Abfrage ist falsch? Wie man es korrigiert?
Wie verwendet man Aliase in LEFT JOIN Abfragen?

+0

@Strawberry Angenommen, die Langhand ist weit schmerzhaft zu sein. Gibt es noch eine Alternative? –

+0

@Strawberry _ "Die Art von JOIN ist immateriell" _ Verstand zu erklären, was das bedeutet? –

+0

@Strawberry _ "Sie können auf diese Weise keine Spaltenaliasnamen referenzieren." _ Warum nicht? Was ist die "Regel" zu wissen, was ist schreiben und was ist falsch? –

Antwort

2

Auf gleicher Ebene der Abfrage, die Sie nicht Spalte Aliase in ON Klausel verwenden können, jedoch können Sie den vollständigen Ausdruck von Alias ​​in ON Klausel

SELECT `table1`.`a`, ABS(`table1`.`b`) as tb, `table2`.`c` 
FROM `table1` 
LEFT JOIN `table2` 
ON ABS(`table1`.`b`) = `table2`.`b` 

bearbeiten verwenden Aliase in ON Klausel zu verwenden, können Sie verwenden, in äußere Abfrage wie

SELECT a.`a`, a.tb, b.`c` 
FROM(
    SELECT `a`, ABS(`b`) as tb FROM `table1` 
) a 
LEFT JOIN `table2` as b 
ON a.tb = b.`b` 
+0

@MarkMessa Ich habe meinen Beitrag aktualisiert, um zu sehen, wie Sie Ihre Aliase verwenden können –

+0

Da es mehr SELECT-Klauseln gibt, gibt es eine Leistungsreduzierung mit dieser 2. Anweisung anstelle der 1.? –

+0

@MarkMessa Ja Leistung kann für diese Art von Abfragen beeinträchtigt werden –