我意识到这可能已被问过十亿次了,我可以发誓过去我已经做过这件事了,但今晚我已经脑筋胀落了或者无法理解它出...
我有一个数据库表(" t1"),我需要只能检索特定值出现在特定列中的第一行。
以下是数据样本:
id | qID | Name
---------------------
1 | 1 | Bob
2 | 3 | Fred
3 | 1 | George
4 | 1 | Jack
我想要的结果是:
id | qID | Name
---------------------
1 | 1 | Bob
2 | 3 | Fred
我真正需要退出查询的唯一一列是第一列,但这不是需要删除重复项的地方,我认为不显示整行可能会让人感到困惑。< / p>
我尝试过使用它:
select id, qID, ROW_NUMBER() over(partition by qID order by qID) as zxy
from t1 where zxy = 1
但它给了我这个错误:
Msg 207, Level 16, State 1, Line 14
Invalid column name 'zxy'.
如果我删除查询的 where 部分,其余部分工作正常。我尝试了不同的变量名称,使用单引号或双引号围绕&#39; zxy&#39;但它似乎没有任何区别。并尽可能地尝试,我无法找到 SQL Server 文档的一部分,其中讨论了为表达式指定变量名称,如&#34; as zxy&#34;上述查询的一部分......如果有人有这样的链接,这非常有用。
毋庸置疑,除了&#34; zxy&#34;我还尝试过其他变量名称。但这没什么区别。
帮助!
答案 0 :(得分:3)
WHERE
子句在此过程中的应用早于SELECT
。因此,zxy
中无法使用计算列WHERE
。为了实现您的目标,您需要将原始查询放在子查询或CTE中。
select id, qid
from
(
select id, qID, ROW_NUMBER() over(partition by qID order by qID) as zxy
from t1
) q
where zxy = 1
输出:
| id | qid | |----|-----| | 1 | 1 | | 2 | 3 |
这是 SQLFiddle 演示
Logical Processing Order of the SELECT statement
1 FROM
2 ON
3加入
4 WHERE
5 GROUP BY
6 WITH CUBE或WITH ROLLUP 7有 8选择
9 DISTINCT
10订购 11 TOP
答案 1 :(得分:0)
子句在选择子句之前执行,因此您无法在where cluase中找到ZXY
with cte as
(
select id, qID, ROW_NUMBER() over(partition by qID order by qID) as zxy
from t1
)
select * from cte where zxy = 1
以下是我的博客,它可能对您有所帮助http://sqlearth.blogspot.in/2015/05/how-sql-select-statement-logically-works.html