2016-04-22 4 views
0

ich die unter SQL-Anweisung geschrieben haben und Ergebnisse erzielen, wenn ich das, wo Name = Anweisung nicht ‚name‘Wo Aussage von Concat/union Skript

SELECT CONCAT(`Surname` , ' ', `firstname`) AS NAME 
FROM Prospects 
UNION 
SELECT CONCAT(`last_name` , ' ', `first_name`) AS NAME 
FROM customer 
ORDER BY name; 

Antwort

0
SELECT 
    CONCAT(Surname , ' ', firstname) AS NAME FROM Prospects 
UNION 
SELECT 
    CONCAT(last_name , ' ', first_name) AS NAME FROM customer 
WHERE 
    CONCAT(Surname , ' ', firstname) = <statement> or 
    CONCAT(last_name, ' ', firstname) = <statement> 
ORDER BY name; 
1

Ein paar erkennt Optionen.

Fügen Sie jedem SELECT eine WHERE-Klausel hinzu. Es ist nicht möglich, das Ergebnis des Ausdrucks in der SELECT-Liste durch den zugewiesenen Alias ​​in der WHERE-Klausel derselben Abfrage zu referenzieren. Um das Prädikat in einer WHERE-Klausel angeben, müßten Sie den Ausdruck wiederholen:

SELECT CONCAT(p.surname,' ',p.firstname) AS NAME 
    FROM Prospects p 
    WHERE CONCAT(p.surname,' ',p.firstname) = ? 
    UNION 
SELECT CONCAT(c.last_name,' ',c.first_name) 
    FROM customer c 
    WHERE CONCAT(c.last_name,' ',c.first_name) = ? 
    ORDER BY 1 

MySQL erweitert den SQL-Standard und ermöglichen eine HAVING-Klausel nicht-Aggregat Ausdrücke verweisen, die nicht in einer Gruppe durch

Um den Alias ​​nach Namen in einer WHERE-Klausel zu referenzieren, können Sie eine Inline-Ansicht verwenden. Beachten Sie jedoch, dass es zu einer erheblichen Leistungseinbuße kommen kann, da das Prädikat nicht in die Inline-Ansicht verschoben wird. Das bedeutet, dass MySQL alle Zeilen aus der Sichtabfrage als abgeleitete Tabelle materialisiert und dann die äußere Abfrage gegen die abgeleitete Tabelle ausgeführt wird. Tun Sie dies nicht, besonders bei großen Tischen:

SELECT v.name 
    FROM (SELECT CONCAT(p.Surname,' ',p.firstname) AS NAME 
      FROM Prospects p 
      UNION 
     SELECT CONCAT(c.last_name,' ',c.first_name) 
      FROM customer c 
     ) v 
WHERE v.name = ? 
ORDER BY 1