如何从关联查询结果中选取前300行?SQL语句无结果排查
问题分析与修正
你的SQL语句存在几个关键问题,导致执行后无结果甚至语法异常:
1. 语法错误:多余的分号截断语句
主查询的WHERE子句中,Row_Num BETWEEN 1 AND 300;后面的分号会直接截断当前语句,使得后续的AND [User Category] = 'Subscriber';变成独立的无效语句——这个过滤条件根本没有被执行。
2. 分页逻辑倒置
你先对全表数据生成行号,再过滤符合条件的记录,这会导致:全表排序后的前300行可能完全不在你要筛选的Account ID IN (...)和User Category = 'Subscriber'范围内,自然查不到匹配结果。正确逻辑应该是先过滤符合条件的数据,再对过滤后的结果生成行号。
3. 潜在的数据类型不匹配
[Account ID]与No_Occupation表的[MSISDN]可能存在数据类型不一致的情况(比如一个是数值型,一个是字符型),导致IN关联无法匹配到数据。可以检查两者的字段类型,必要时添加类型转换。
修正后的SQL语句
WITH PagingCte AS ( SELECT [Account ID],[User Name],[Last Name],[User Category], Row_Num = Row_Number() OVER (ORDER BY [User Name]) FROM AllBalance_20230119 -- 先过滤符合条件的数据,再生成行号 WHERE [User Category] = 'Subscriber' AND [Account ID] IN (SELECT [MSISDN] FROM No_Occupation) ) SELECT [Account ID],[User Name],[Last Name],Row_Num FROM PagingCte WHERE Row_Num BETWEEN 1 AND 300;
如果存在数据类型不匹配的情况,可以添加类型转换(示例为Account ID转字符串):
WITH PagingCte AS ( SELECT [Account ID],[User Name],[Last Name],[User Category], Row_Num = Row_Number() OVER (ORDER BY [User Name]) FROM AllBalance_20230119 WHERE [User Category] = 'Subscriber' AND CAST([Account ID] AS VARCHAR(20)) IN (SELECT [MSISDN] FROM No_Occupation) ) SELECT [Account ID],[User Name],[Last Name],Row_Num FROM PagingCte WHERE Row_Num BETWEEN 1 AND 300;
内容的提问来源于stack exchange,提问作者Frank Samai
相关产品推荐
相关产品推荐

