2016-08-23 68 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