簡體   English   中英

ROW_NUMBER和多個JOIN

[英]ROW_NUMBER and multiple JOIN

當我測試此請求時:

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

為什么以及如何糾正我的要求?

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

為什么:

您不能訪問select的where子句中的別名lineNumb列-上下文中未定義。

糾正方法:

將您所擁有的用作子查詢或CTE,然后使用where從中選擇。

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

您不能在同一級別的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;

在此問題中檢查SELECT語句中的執行順序:

SQL select語句的不同部分的執行順序是什么?

SELECT子句直到語句執行的后期才被讀取。 因此,直到獲得ORDER BY子句,您才能引用別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM