如何使用别名加入 table

How to join to a table using aliases

在此先感谢您的帮助。

我想知道如何连接我拥有的两个 SQL 语句,因为我已经为列指定了别名。

源 table 看起来像这样(请记住,由于其他要求,更改此 table 的布局非常昂贵):

ColumnID    RowIdx    Val
1           0         "Mr A"
1           1         "Mr B"
1           2         "Mr C"
2           0         "M40 2TB"
2           1         "G23 XYN"
2           2         "HJ 23N"

我使用两个 sql 语句在我认为加入的 table 上创建视图。这看起来像这样:

-- Statement #1
CREATE TEMP TABLE nameTable AS (SELECT 
    max(CASE WHEN ColumnID=1 THEN Val ELSE null END) AS Name, 
    row_number() over (ORDER BY RowIdx) AS rowindex 

FROM myTable 

WHERE (ColumnID=1) 

GROUP BY RowIdx
ORDER BY RowIdx);

-- Statement #2
CREATE TEMP TABLE postcodeTable AS (SELECT 
    max(CASE WHEN ColumnID=2 THEN Val ELSE null END) AS PostCode, 
    row_number() over (ORDER BY RowIdx) AS rowindex 

FROM myTable 

WHERE (ColumnID=2) 

GROUP BY RowIdx
ORDER BY RowIdx);

-- Statement #3
SELECT * FROM nameTable
INNER JOIN postcodeTable ON nameTable.rowIndex=postcodeTable.rowIndex

结果如下:

Name    PostCode    RowIndex
Mr A    M40 2TB     0
Mr B    G23 XYN     1
Mr C    HJ 23N      2

我想将这些组合成一个语句(因为它使我的程序生成语句更简单。

我选择从语句 1 和 2 中省略一些逻辑,因为它对于我的示例来说不必要地复杂,但是我遗漏的内容禁止我这样做:

SELECT 
    max(CASE WHEN ColumnID=1 THEN Val ELSE null END) AS Name, 
    max(CASE WHEN ColumnID=2 THEN Val ELSE null END) AS PostCode, 
    row_number() over (ORDER BY RowIdx) AS rowindex 

FROM myTable 

WHERE (ColumnID=1 OR ColumnID=2) 

GROUP BY RowIdx
ORDER BY RowIdx

我现在正在考虑做这样的事情,但我不确定是否可行:

SELECT 
    max(CASE WHEN ColumnID=1 THEN Val ELSE null END) AS Name, 
    row_number() over (ORDER BY RowIdx) AS rowindex 

FROM myTable 

INNER JOIN (SELECT 
        max(CASE WHEN ColumnID=2 THEN Val ELSE null END) AS PostCode, 
        row_number() over (ORDER BY RowIdx) AS rowindex 

    FROM myTable 

    WHERE (ColumnID=2) 

    GROUP BY RowIdx
    ORDER BY RowIdx) AS postcodeTable ON rowIndex=postcodeTable.rowIndex

WHERE (ColumnID=1) 

GROUP BY RowIdx
ORDER BY RowIdx);

这是我应该考虑做的事情吗?还是我应该坚持使用临时 tables?如果是,我该如何让它工作? rowIndex=postcodeTable.rowIndex rowIndex 中的编译问题不存在。

我知道原始模式的格式很奇怪,但有各种外部原因。如果您需要更多信息,请告诉我。

我可能遗漏了一些东西,但我不明白您的示例查询中的复杂性的必要性。类似以下(未经测试的)查询是否有效?

SELECT Name, PostCode, A.RowIdx AS RowIdx 
FROM
    (SELECT Val AS Name, RowIdx FROM myTable WHERE ColumnID=1) A
    INNER JOIN
    (SELECT Val AS PostCode, RowIdx FROM myTable WHERE ColumnID=2) B
ON A.RowIdx = B.RowIdx;