【发布时间】:2018-04-11 08:32:58
【问题描述】:
我正在寻找有关使用别名而不是原始数据加入的最佳方式的建议。例如数据在加入之前被修改。
一个例子:
CREATE TABLE Table1 (
No1 varchar(10)
);
CREATE TABLE Table2 (
No1 varchar(10)
);
INSERT INTO Table1 (No1)
VALUES ('222');
INSERT INTO Table2 (No1)
VALUES ('111');
如果我使用 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]
这给出了结果:
| T1 No | T2 No |
|--------+--------|
| 111 | (null) |
| (null) | 111 |
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]
这给出了结果:
| T1 No | T2 No |
|-------+-------|
| 111 | 111 |
http://www.sqlfiddle.com/#!18/5fd7c/14
这正是我正在寻找的。然而,我正在处理的现实生活中的查询是巨大的,并且子查询它以加入别名使得它变得如此混乱。
任何人都可以就更好的方法给我建议吗?还是这是唯一的方法?
【问题讨论】:
-
您可以在连接条件本身中使用 case 表达式。如果表很大,性能可能会成为问题,
标签: sql sql-server join alias