别名上的JOIN语句 - SQL Server

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

这正是我要找的.但是,我正在处理的现实生活中的查询是巨大的,并且查询它加入别名会使它变得如此混乱.

任何人都可以就更好的方法给我建议吗?或者这是唯一的方法吗?

Lar*_*rnu 5

好的,首先,了解SELECT语句逻辑处理顺序可能对您有益。具体来说,该顺序为:

  1. 加入
  2. 哪里
  3. 通过...分组
  4. 与多维数据集或与汇总
  5. 拥有
  6. 选择
  7. 不同
  8. 订购
  9. 最佳

请注意,这SELECT是要处理的第八件事,即要处理列的别名的时间。这意味着您必须在第9步(DISTINCT)之前引用列别名,这实际上意味着您在左侧就可以了ORDER BY,仅此而已。

因此,如果要引用由表达式派生的列,则这样做的方法很少,下面列出了一些方法。

第一种方式:

SELECTON子句中使用表达式。从而:

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)

这些只是一些选择,但希望可以为您找到适合自己需求的正确方法。