2016-08-23 33 views
0

当我使用下面的代码(它来自Oracle的人,他说没有理由不工作...)我收到通知,有不正确的语法位于在'最后')。任何想法如何我可以改变这是“SQL适当”?我的想法是,它不喜欢最后的选择声明。SQL - 嵌套选择来自克劳斯与计数

select 
    * 
from 
    CPINInvest 
where 
    [Case ID||] not in 
     (
     select [Case ID||] 
     from 
      (
      select [Case ID||], count(*) 
      from CPINComm140 
      where [Role CD||]='PRI||' 
      group by [Case ID||] 
      having count(*)=1 
      ) 
     ) 
+0

你真的在最后有管道符号的列名吗?这很奇怪。或者它应该是一个操作符(在Oracle中它表示字符串连接)? – trincot

+0

不幸的是......我们在最后有双管道的列:(不是我的设计,不是我的选择,不是我的偏好lol我们正在填充这些将用于填充Oracle数据库的表,并且开发人员选择了双管道来表示一个列的末尾 – Richard

+0

Offtopic:双管道来表示列的末尾这就像我曾经听过的最讨好的事情考虑数据库设计模式:D –

回答

0

它可以缩短。

select * from CPINInvest 
where [Case ID||] not in (
     select [Case ID||] 
     from CPINComm140 
     where [Role CD||]='PRI||' 
     group by [Case ID||] 
     having count(*)=1 
    ); 

但严重的是,管道在fieldnames?育!

原始查询失败的原因是:
1)count(*)需要一个别名。例如[total]
2)tsql有奇怪的要求,一些子查询需要一个别名

+0

工程就像一个魅力!谢谢。 – Richard

+0

相当肯定1)不是问题 - 在SQLServer中允许使用空白列名(正如列名中带有||) - 和2)是问题所在。 – Hogan

+0

@Hogan那么,我试了一下[在这里](http://rextester.com/l/sql_server_online_compiler)。那么你能解释为什么例如它在尝试这个时会给出一个错误:'declare @T table(id int);插入到@T值(1),(2); select * from(select ID,count(*)from @T group by id)q;' – LukStorms

0

SQL喜欢你给你的子查询别名,即使他们不使用。这将工作,但@LukStorms更短版本更好。

select * 
from CPINInvest 
where 
    [Case ID||] not in 
     (
     select [Case ID||] 
     from 
      (
      select [Case ID||], count(*) 
      from CPINComm140 
      where [Role CD||]='PRI||' 
      group by [Case ID||] 
      having count(*)=1 
      ) x 
     ) y 
+3

也应该拍摄这些列名的任何人。 *认真* – Hogan

+0

我100%同意你 – Richard

0

使用下面的查询。您忘记将别名添加到子表中。

select 
    * 
from 
    CPINInvest 
where 
    [Case ID||] not in 
     (
     select [Case ID||] 
     from 
      (
      select [Case ID||], count(*) 
      from CPINComm140 
      where [Role CD||]='PRI||' 
      group by [Case ID||] 
      having count(*)=1 
      )t 
     ) 
+0

为什么发布5分钟前发布的答案完全相同? – Hogan