Rya*_*don 7 sql sql-server alias join
我正在寻找有关使用别名而不是原始数据加入的最佳方式的建议.例如,数据在加入之前被修改.
一个例子:
CREATE TABLE Table1 (
No1 varchar(10)
);
CREATE TABLE Table2 (
No1 varchar(10)
);
INSERT INTO Table1 (No1)
VALUES ('222');
INSERT INTO Table2 (No1)
VALUES ('111');
Run Code Online (Sandbox Code Playgroud)
如果我使用case语句创建了一个连接,但我想加入case语句的别名,这不适用于通常的连接语法,例如
SELECT
CASE WHEN T1.[No1] = '222' THEN '111' ELSE T1.[No1] END AS [T1 No],
T2.[No1] AS [T2 No]
FROM Table1 T1
FULL JOIN Table2 T2
ON T1.[No1] = T2.[No1]
Run Code Online (Sandbox Code Playgroud)
这给出了结果:
| T1 No | T2 No |
|--------+--------|
| 111 | (null) |
| (null) | 111 |
Run Code Online (Sandbox Code Playgroud)
http://www.sqlfiddle.com/#!18/203e8/1
但是,我加入别名的方法是:
SELECT
T1.[T1 No],
T2.[No1] AS [T2 No]
FROM
(
SELECT
CASE WHEN T1.[No1] = '222' THEN '111' ELSE T1.[No1] END AS [T1 No]
FROM Table1 T1
) T1
JOIN Table2 T2
ON T1.[T1 No] = T2.[No1]
Run Code Online (Sandbox Code Playgroud)
这给出了结果:
| T1 No | T2 No |
|-------+-------|
| 111 | 111 |
Run Code Online (Sandbox Code Playgroud)
http://www.sqlfiddle.com/#!18/5fd7c/14
这正是我要找的.但是,我正在处理的现实生活中的查询是巨大的,并且查询它加入别名会使它变得如此混乱.
任何人都可以就更好的方法给我建议吗?或者这是唯一的方法吗?
好的,首先,了解SELECT语句的逻辑处理顺序可能对您有益。具体来说,该顺序为:
请注意,这SELECT是要处理的第八件事,即要处理列的别名的时间。这意味着您必须在第9步(DISTINCT)之前引用列别名,这实际上意味着您在左侧就可以了ORDER BY,仅此而已。
因此,如果要引用由表达式派生的列,则这样做的方法很少,下面列出了一些方法。
第一种方式:
在SELECT和ON子句中使用表达式。从而:
SELECT CASE WHEN T1.[No1] = '222' THEN '111'
ELSE T1.[No1]
END AS [T1 No],
T2.[No1] AS [T2 No]
FROM Table1 T1
JOIN Table2 T2 ON CASE WHEN T1.[No1] = '222' THEN '111'
ELSE T1.[No1]
END = T2.[No1];
Run Code Online (Sandbox Code Playgroud)
这会使事情有些混乱,因为它会使查询“忙”起来。
第二种方式:
使用子选择:
SELECT [T1 No]
FROM (SELECT CASE WHEN T1.[No1] = '222' THEN '111'
ELSE T1.[No1]
END AS [T1 No],
FROM Table1 T1) AS Tsq1
JOIN Table2 T2 ON Tsq1.[T1 No] = T2.[No1];
Run Code Online (Sandbox Code Playgroud)
第三种方式
这与最后一个选项基本相同,但是使用CTE
WITH T1 AS (
SELECT CASE WHEN T1.[No1] = '222' THEN '111'
ELSE T1.[No1]
END AS [T1 No],
FROM Table1 T1)
SELECT [T1 No]
FROM T1
JOIN Table2 T2 ON T1.[T1 No] = T2.[No1];
Run Code Online (Sandbox Code Playgroud)
第四种方式:
您还可以创建一个VIEW,然后JOIN在其上:
CREATE VIEW Table1_vw AS
SELECT *,
SELECT CASE WHEN T1.[No1] = '222' THEN '111'
ELSE T1.[No1]
END AS [T1 No]
FROM Table1 T1;
GO
SELECT T1.[T1 No]
FROM Table1_vw T1
JOIN Table2 T2 ON T1.[T1 No] = T2.[No1];
Run Code Online (Sandbox Code Playgroud)
这些只是一些选择,但希望可以为您找到适合自己需求的正确方法。