【问题标题】:ROW_NUMBER and multiple JOINROW_NUMBER 和多个 JOIN
【发布时间】:2014-06-05 18:15:19
【问题描述】:

当我测试这个请求时:

SELECT 
    *, ROW_NUMBER() OVER (ORDER BY test1) AS lineNumb 
FROM 
    (SELECT DISTINCT 
        tab1.test1, tab2.test2
     FROM TB_tab1 tab1
     JOIN TB_tab2 tab2 ON tab2.test3 = tab1.test3 
     JOIN TB_tab3 tab3 ON tab3.test4 = tab1.test4 
     WHERE tab3.test5 != 'test') AS sub
WHERE lineNumb BETWEEN 1 AND 5

我明白了:

错误:列名无效:'lineNumb'。 SQLState:S0001 错误代码:207

为什么以及如何更正我的请求?

【问题讨论】:

标签: sql sql-server


【解决方案1】:
SELECT *
FROM 
(
SELECT *, ROW_NUMBER() OVER (ORDER BY test1) AS lineNumb FROM (
SELECT DISTINCT tab1.test1, tab2.test2
FROM TB_tab1 tab1
JOIN TB_tab2 tab2 ON tab2.test3 = tab1.test3 
JOIN TB_tab3 tab3 ON tab3.test4 = tab1.test4 WHERE tab3.test5 !='test') as sub
) as sub2 
WHERE lineNumb BETWEEN 1 AND 5

【讨论】:

    【解决方案2】:

    为什么:

    您无法访问您的 select 的 where 子句中的别名 lineNumb 列——它没有在上下文中定义。

    如何改正:

    使用您所拥有的作为子查询或 CTE 并使用您的 where 从中选择。

    SELECT * 
      FROM (<you existing query without the where>)
     WHERE lineNumb <= 5
    

    【讨论】:

      【解决方案3】:

      您不能在同一级别的where 中使用列别名。你可以用分析函数做你想做的事。你甚至不需要distinct:

      SELECT *
      FROM (SELECT tab1.test1, tab2.test2,
                   ROW_NUMBER() OVER (PARTITION BY tab1.test1, tab2.test2 ORDER BY test1) as seqnum,
                   DENSE_RANK() OVER (ORDER BY test1) as lineNumb
            FROM TB_tab1 tab1
            JOIN TB_tab2 tab2 ON tab2.test3 = tab1.test3 
            JOIN TB_tab3 tab3 ON tab3.test4 = tab1.test4
            WHERE tab3.test5 <> 'test'
           ) sub
      WHERE lineNumb BETWEEN 1 AND 5 AND seqnum = 1;
      

      【讨论】:

        【解决方案4】:

        在这个问题的 SELECT 语句中查看执行顺序:

        What's the execute order of the different parts of a SQL select statement?

        直到语句执行的后期才会读取 SELECT 子句。因此,在到达 ORDER BY 子句之前,您不能引用别名。

        【讨论】:

          猜你喜欢
          • 2012-04-02
          • 1970-01-01
          • 2018-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多