2016-10-30 8 views
0

Ich habe eine Abfrage, die mit einem mehrdeutigen Spaltenfehler fehlschlägt. Leider kann ich dieses Problem wegen des verwendeten Frameworks (Magento 1) nicht einfach lösen, indem ich den Spaltennamen mit dem korrekten Tabellennamen in der Where-Klausel voranstelle.MySQL mehrdeutige Spalte ohne Präfix Tabellenname aufzulösen und ohne Unterabfrage

die beiden Beispieltabellen Bei

T1 = colA | colB | colC 
T2 = colD | colB | colE 

Ich möchte eine Abfrage, die die Tabellen auf colA und colD, wählen Sie nur colC und colE, haben aber eine where-Klausel auf T1 colB beitreten. Die gerade nach vorne SQL würde wie folgt aussehen:

SELECT colC, colE 
FROM T1 LEFT JOIN T2 ON colA=colD 
WHERE T1.colB=1 

Das Problem ist, dass die ‚wo‘ Klausel bereits gesetzt ist von Kern-Code als WHERE colB=1 und ich kann es nicht leicht den T1 Präfix hinzufügen ändern.

Ich habe versucht, es als Unter Abfrage wie folgt umschreiben:

SELECT colC,colE 
FROM T1 LEFT JOIN (SELECT colD,colE FROM T2) ON colA=colD 
WHERE colB=1 

Dies funktioniert und gibt mir, was ich erwarten würde, aber es ist nicht akzeptabel langsam.

Gibt es clevere SQL-Tricks, mit denen entweder die Unterabfrage optimiert oder der Join neu geschrieben werden kann, sodass ich die where-Klausel ohne das Tabellenpräfix verwenden kann.

+0

Sie suchen noch weitere Einschränkungen B. kann der Code 'where colB = 1' irgendwo platziert werden oder muss er damit enden? Haben Sie eine 1: 1 Beziehung zwischen Ihren Tabellen oder können Sie mit 'colA = colD' mehrere Zeilen in T2 für eine Zeile bekommen in T1? Verwenden Sie zufällig mysql 5.7? – Solarflare

+0

@ Solarflare Magento baut die letzte Abfrage von Objekten, sodass ich die Position der 'where'-Klausel nicht kontrollieren kann und am Ende der Abfrage erscheint. Für eine Verwendung gibt es eine Eins-zu-eins-Beziehung, aber in der zweiten Verwendung gibt es eine Eins-zu-Eins-Beziehung. Ich benutze MySQL Version 5.5 – Dom

Antwort

1

Wie funktioniert das?

SELECT colC, colE 
FROM T1 LEFT JOIN 
    T2 
    ON colA = colD AND T1.colB = 1 
WHERE T1.colB = 1; 

Eine weitere Alternative ist eine Unterabfrage, die wie folgt aussieht:.

SELECT colC, 
     (SELECT colE 
     FROM T2 
     WHERE T1.colA = T2.colD 
     ) as colE 
FROM T1 
WHERE colB = 1; 

Diese so schnell wie die ursprüngliche Abfrage durchführen sollte (was vermutlich Vorteil von Indizes nehmen wird

+0

Sie sind zweite Frage beantwortet meine Frage genau wie ich gefragt habe. Leider hat Magento mir einen Kurvenball geworfen. Es verwendet die vollständige Abfrage, die Sie vorgeschlagen haben, an einer Stelle, aber dann nur den Abschnitt from, joins und wo in einer zweiten Abfrage (zum Zählen) und streift die ausgewählten Spalten aus, sodass die Abfrage fehlschlägt. Zurück zum Zeichenbrett! – Dom

Verwandte Themen