2017-08-23 182 views
0

當我執行左連接時,出現「無效列名'FirstPart'」錯誤。SQL無效列名稱

我知道我的專欄是一個別名,但我不知道該怎麼做:

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

重複上述表達式或把它在一個子查詢 – Siyual

+0

如果你理解了T-SQL邏輯處理順序(https://stackoverflow.com/questions/3270338/confused-about-itzik-ben-gans-logical-query-processing-order-in-his-sql-server),你會明白爲什麼你有問題的第一個地方,即你不能在FROM子句(包含JOIN)中使用別名(在SELECT子句中)。 – jyao

回答

5

你的別名將可如果你包裹在一個外部查詢這件事,但因爲你在同一級別的別名,你需要用相同的邏輯推導再次它:

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 

如果這個包裹,可以通過子查詢引用:

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 

請注意,如果您可以避免與like匹配的加入,您將獲得更好的性能。

+0

收到謝謝,我看到我做錯了 – Tinashe

0

您可以使用子查詢中使用別名

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

收到謝謝,這個作品太 – Tinashe

0

SQL Server提供了第四個選項(重複表達,使用子查詢,或者使用CTE之後)。 。 。 apply。這是很好的,因爲你可以在「鳥巢」的表達,而不必縮進代碼越來越多:

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

尼斯...非常感謝你。 – Tinashe