SQL:子查询中的列不出现

时间:2020-11-09 05:54:29

标签: mysql sql

MySQL 5.7中有一个查询:

SELECT * FROM
(
SELECT (@rowNum:=@rowNum+1) AS rowNo,t.* FROM table_target t,(SELECT (@rowNum :=0)) AS b 
WHERE p_d = '2020-11-08' 
ORDER BY kills DESC
) t
WHERE t.uid= '8888'

运行此查询,没有异常,但是B列消失,并且如果在外部查询中使用select b from,它将返回unknown column异常。

我有2个问题:

  1. 为什么(SELECT (@rowNum :=0))不出现?
  2. 在Oracle中(@rowNum:=@rowNum+1)row_number() over ()等价吗?如果是这样,如何理解它...

谢谢您的帮助。

此外,我刚刚发现是否将(SELECT (@rowNum :=0) )放在左侧:

...
SELECT (SELECT (@rowNum :=0) ) AS b, (@rowNum:=@rowNum+1) AS rowNo , t.* FROM table_target t
...

然后行号列不再增加,为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

您在这里问了3个问题:

问题1:为什么没有出现(SELECT(@rowNum:= 0))?

答案:您已将(SELECT (@rowNum :=0)) as B用作连接它的表,但没有在select之后的列列表中调用它。这就是为什么它不在输出中显示它的原因。您将其称为(@rowNum:=@rowNum+1),它表示从1开始的增量表示之后的值。

问题2:在Oracle中,(@rowNum:= @ rowNum + 1)是否等于row_number()而不是()?如果是这样,怎么理解

答案:是的,它是等效的。 MySql 8.0 and above也支持此功能(称为窗口功能)。它的工作方式是:

  • 在初始化查询时,(SELECT (@rowNum :=0))变量@rowNum将被初始化为值0
  • 当我们在select中调用(@rowNum:=@rowNum+1)时,它将在@rowNum中加1并为select查询返回的每一行分配给它自己。 这样将打印行号。

问题3:是否将(SELECT(@rowNum:= 0))放在左侧:

答案::如果将(SELECT (@rowNum :=0) )作为字段列表放在select之后,则它将在每个@rownum中将0的值初始化为 img{ width: 100%; height: 500px; } .dropdown-menu{ background-color: #49f357; } .dropdown-menu{ right: 0 !important; } .dropdown-toggle{ background-color:#2de03c; } .dropdown-toggle > .active { color: aqua;} .dropdown-toggle:hover {background-color: #0eb41c;} .dropdown-menu > .active > a,.dropdown-menu > .active > a:hover.dropdown-menu > .active > a:focus {color: white!important; background-color: #e7e7e7!important;} .dropdown-item{ background-color: #2de03c; } .dropdown-menu-center { left: 50% !important; right: auto !important; text-align: center !important; transform: translate(-50%, 0) !important; } .textwhite{ color:white ; } .collapse ul.navbar-nav> .nav-item > a { color: white; } /* The container <div> - needed to position the dropdown content */ .dropdown { position: relative; display: inline-block; } .nav-collapse.collapse { display: none !important; height: auto !important; overflow: visible !important; } .navbar{ position: sticky } select返回的行。这就是为什么您不会获得增值的原因。

答案 1 :(得分:1)

列“消失”,因为值为undefined。 MySQL不保证NULL中表达式的求值顺序,初始化可能不起作用。

第二,即使变量起作用,您的代码也无法实现预期的目标,因为变量可能不遵守SELECT。我想你打算:

ORDER BY

可能有更好的方法来做您想要的事情。但是您的问题是关于变量和MySQL 5.7的。