sql 执行错误 当没有用EXISTS 引入子查询时 在选择列表中只能指定一个表达式

SELECT TOP (2) SUM(a.length) AS ss, b.SMT_user, b.SMT_colxr, b.SMT_pq, b.SMT_id
FROM user_recorder AS a INNER JOIN
SMT_user AS b ON a.userName = b.SMT_user AND b.SMT_id NOT IN
(SELECT TOP (0) SUM(a.length) AS ss, b.SMT_user, b.SMT_colxr, b.SMT_pq, b.SMT_id
FROM user_recorder AS a INNER JOIN
SMT_user AS b ON a.userName = b.SMT_user
GROUP BY b.SMT_user, b.SMT_colxr, b.SMT_pq, b.SMT_id
ORDER BY b.SMT_id DESC)
GROUP BY b.SMT_user, b.SMT_colxr, b.SMT_pq, b.SMT_id
ORDER BY b.SMT_id DESC
帮忙看下 急

因为set Fnote= 这后面是只能给一个值得。现在估计有复数个,所以有问题。解决方法如下:

1、创建一个临时表,IFOBJECT_ID('tempdb..#tmp1') IS NOT NULL DROP TABLE #tmp1; CREATE TABLE #tmp1(Col1 varchar(50),Col2 varchar(200));。

2、往临时表中插入几行测试数据,用于exists使用insert into #tmp1(Col1, Col2) values('Code1', '1');insert into #tmp1(Col1, Col2) values('Code10', '2');insert into #tmp1(Col1, Col2) values('Code100', '3');。

3、查询临时表中的测试数据select * from #tmp1;。

4、如果在exists中查询的结果是NULL,最终exists返回的仍然是true。例如,下面的语句返回的就是整个表的结果select * from #tmp1 where exists(select null);。

5、使用子查询结合exists使用,当exists返回true的时候,就返回指定结果select *from #tmp1where exists(select 1 from #tmp1 where Col2 = 2)and Col1 = 'Code1'。

6、使用子查询结合exists使用,当exists返回false的时候,就不会返回指定的结果。例如,将上面SQL子查询的Col2从等于2,改成等于20select *from #tmp1where exists(select 1 from #tmp1 where Col2 = 20)and Col1 = 'Code1'。

7、在存储过程中,经常会使用exists判断条件是否成立,例如,判断临时表中是否存在记录if exists(select 1 from #tmp1)print '存在数据'elseprint '不存在数据'。就完成了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-28
错误在这里
SMT_id NOT IN
(SELECT TOP (0) SUM(a.length) AS ss, b.SMT_user, b.SMT_colxr, b.SMT_pq, b.SMT_id
FROM user_recorder AS a INNER JOIN

如果要用in,你后面select必须能只能由一个列组成,你的select后面跟了n个列,自然报那个错误了追问

那如果是多个列呢 比如一个条件无法满足需要呢

追答

那就用exists替代in
select * from A where B in (select b from tab)

select * from A where exists(
select b from tab where A.b = tab.B and A.b2 = tab.B2)

追问

麻烦高手 QQ加下好友 请教下这方面的一些问题 379899146 谢了

追答

不上qq得

追问

那怎么办啊 想请你帮我修改下SQL语句 我现在改成一个单字段了 还是不行 出了GROUP by 附近错误

追答

select A,B, SUM(C)
FROM tab
group by A, B

聚合函数之外的所有列必须出现在group by之后

追问

这个我知道啊 我单独运行2条sql语句都是正常的 SELECT TOP (10) b.SMT_id
FROM message_recorder AS a INNER JOIN
SMT_user AS b ON a.userId = b.SMT_id
WHERE (b.SMT_id 2082)
GROUP BY b.SMT_id
ORDER BY COUNT(*) DESC 这条是子语句 执行结果

本回答被提问者采纳
第2个回答  2012-02-14
就是说你的 in 后面的语句 只能有一个结果列 SELECT b.SMT_id FROM
第3个回答  2014-09-19
是因为 你的set Fnote= 这后面是只能给一个值得。现在估计有复数个,所以有问题。
如果需要动态更新,那最后的那句where FStatus=0 ,也需要和你的子查询一样的修改。

现在条件比较少,就会变成,update 的where指定后,数据很多。而更新的值也很多,那就是多对多,sql就不知道更新哪个值了。

包exsits的原因,是使用这个函数,能限定到该行,而使用in,只能是复数个。