2017-08-23 3 views
0

Ich erhalte einen Fehler "ungültiger Spaltenname 'FirstPart'", wenn ich eine linke Verbindung mache.SQL ungültiger Spaltenname

weiß, dass ich meine Spalte ein Alias ​​ist, aber ich bin nicht sicher, was zu tun ist:

SELECT 
    h.Type, 
    a.name, 
    CASE 
     WHEN a.name LIKE '%-%' 
      THEN LEFT(a.name, CHARINDEX('-', a.name) - 1) 
      ELSE a.name 
    END as FirstPart, 
    CASE 
     WHEN a.name LIKE '%-%' 
      THEN RIGHT(a.name, CHARINDEX('-', Reverse(a.v)) - 1) 
    END as LastPart 
FROM 
    Table1 a 
LEFT JOIN 
    Table2 h ON a.FirstPart = h.ID 
+1

Entweder wiederholen Sie den Ausdruck oder zieht es in einer Unterabfrage – Siyual

+0

Wenn Sie die T-SQL-logische Verarbeitungsreihenfolge zu verstehen (https://stackoverflow.com/questions/3270338/confused-about-itzik-ben-gans-logical-query-processing-order-in-his-sql-server), Sie werden verstehen, warum Sie das Problem in der haben erster Platz, dh Sie können in der FROM-Klausel (die JOINs enthält) keinen Alias ​​(in der SELECT-Klausel) verwenden. – jyao

Antwort

5

Ihr Alias ​​zur Verfügung stehen würde, wenn Sie diese ganze Sache in einer äußeren Abfrage eingewickelt, aber da Sie sind die gleiche Höhe wie der Alias, müssen Sie es wieder mit der gleichen Logik abzuleiten:

select * 
from 
(Select h.Type, a.name, 
    CASE WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) ELSE a.name END as FirstPart, 
    CASE WHEN a.name LIKE '%-%' THEN RIGHT(a.name, Charindex('-', Reverse(a.v)) - 1) END as LastPart 
    from Table1 a) inn 
left join Table2 h 
    on inn.FirstPart = h.ID 
:

Select 

    h.Type, 
    a.name, 
    CASE 
    WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) 
    ELSE a.name 
    END as FirstPart, 
    CASE 
    WHEN a.name LIKE '%-%' THEN RIGHT(a.name, Charindex('-', Reverse(a.v)) - 1) 
    END as LastPart 
from Table1 a 
    left join Table2 h 
    on CASE WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) ELSE a.name END = h.ID 

Wenn Sie diese gewickelt, Sie durch Unterabfrage verweisen könnte 0

Als eine Randnotiz, wenn Sie die Verbindung bei einer like Übereinstimmung vermeiden können, erhalten Sie eine bessere Leistung.

+0

erhalten mit dank, ich sehe, was ich falsch gemacht habe – Tinashe

0

Sie können Unterabfrage verwenden, um die Alias ​​

SELECT h.type, 
     a.name, 
     a.firstpart, 
     a.lastpart 
    FROM (SELECT name, 
       CASE WHEN name LIKE '%-%' 
        THEN LEFT(name, CHARINDEX('-', name) - 1) 
        ELSE name 
       END AS firstpart, 
       CASE WHEN name LIKE '%-%' 
        THEN RIGHT(name, CHARINDEX('-', REVERSE(v)) - 1) 
       END AS lastpart 
      FROM table1 
     ) a 
    LEFT JOIN table2 h 
    ON a.firstpart = h.id 
+0

erhalten mit dank, das funktioniert auch – Tinashe

0

SQL Server zu verwenden, bietet vierte Option (nach dem Ausdruck zu wiederholen, unter Verwendung von Unterabfragen oder mit CTE). . . apply. Das ist schön, weil man „Nest“ Ausdrücke, ohne den Code immer mehr einrücken mit:

Select h.Type, a.name, FirstPart, LastPart 
from Table1 a cross apply 
    (values (CASE WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) ELSE a.name END, 
       CASE WHEN a.name LIKE '%-%' THEN RIGHT(a.name, Charindex('-', Reverse(a.v)) - 1) END) 
    ) v(First_part, LastPart) left join 
    Table2 h 
    on v.FirstPart = h.ID; 
+0

Nizza ... vielen Dank. – Tinashe

Verwandte Themen