2010-07-29 91 views
1

我正在嘗試使用case語句,但不斷收到錯誤。以下是聲明:在THEN表達式中使用CASE語句值

select TABLE1.acct, 
     CASE 
      WHEN TABLE1.acct_id in (select acct_id 
            from TABLE2 
           group by acct_id 
            having count(*) = 1) THEN 
      (select name 
       from TABLE3 
       where TABLE1.acct_id = TABLE3.acct_id) 
      ELSE 'All Others' 
     END as Name 
    from TABLE1 

當我用字面值替換THEN表達式中的TABLE1.acct_id時,查詢起作用。當我嘗試從查詢的WHEN部分使用TABLE1.acct_id時,出現錯誤,說明結果不止一行。看起來THEN表達式忽略了WHEN語句使用的單個值。不知道,也許這不是CASE聲明的有效使用。

我想查看在TABLE2中有一個條目的帳戶的名稱。

任何想法將不勝感激,我是一種新的SQL。

+0

您在SQL是一種新的,但你已經是相當複雜的... – pascal 2010-07-29 18:31:27

+0

*大膽的價值*失去了一些編輯...無論如何,當你取代大膽的價值......什麼? – pascal 2010-07-29 18:32:24

+1

在你的設計中是否存在一些約束,鏈接TABLE1,TABLE2,TABLE3,它表示'acct_id'在'select'acct_id從TABLE2組通過acct_id具有count(*)= 1'意味着'select count(*)from TABLE3其中acct_id = TABLE3。acct_id'返回1? – pascal 2010-07-29 18:33:56

回答

1

首先,您在TABLE1.acct之後缺少逗號。其次,您將TABLE1作爲acct進行別名,因此您應該使用它。

Select acct.acct 
    , Case 
     When acct.acct_id in (Select acct_id 
           From TABLE2 
           Group By acct_id 
           Having Count(*) = 1) 
      Then (Select name 
        From TABLE3 
        Where acct.acct_id = TABLE3.acct_id 
        Fetch First 1 Rows Only) 
     Else 'All Others' 
     End as Name 
From TABLE1 As acct 

正如其他人所說,你應該調整你的THEN子句,以確保只有一個返回值。您可以通過將Fetch First 1 Rows Only添加到子查詢中來實現此目的。

+0

+1:用逗號抓住好。 – kbrimington 2010-07-29 18:31:48

+1

我不認爲逗號是「結果超過一行」的根本原因,可能是複製/粘貼的結果。 – FrustratedWithFormsDesigner 2010-07-29 18:37:43

+0

哇,真棒迴應。非常感謝。實際的查詢中,有更多的垃圾,我將它配對以專注於我的問題,因此語法錯誤,如逗號和表別名。我正在對付db2,而我最高分1給我一個錯誤。這是沒有道理的,這個acct_id只出現一次,那麼它怎麼能返回多行呢?似乎THEN聲明忽略了單個值。 – YeeHaw 2010-07-29 18:40:09

0
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id 

會給你表3中所有的名字,其中有一個伴隨排在表1中前行不進入從表2中選擇行。

0

必須獲得多個值。

你可以用更換閥體...

(select count(name) from TABLE3 where TABLE1.acct_id = TABLE3.acct_id) 

...來縮小其行返回的倍數。

可能是這種情況,您只需要一個DISTINCTTOP 1來減少結果集。

祝你好運!

+0

同意,但爲什麼當我用字面值替換TABLE1.acct_id時,查詢運行良好? – YeeHaw 2010-07-29 18:45:27

+0

我期望如此。嘗試選擇計數(名稱)並檢查結果,查找大於1的計數。我認爲它會爲您縮小範圍。 – kbrimington 2010-07-29 20:21:08

0

我認爲這裏發生的事情是你的情況必須返回一個值,因爲它將是「名稱」列的值。子查詢(select acct_id from TABLE2 group by acct_id having count(*) = 1)是可以的,因爲它只會返回一個值。根據您的數據,(select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)可能會返回多個值。問題在於你試圖將多個值插入單行的單個字段中。

接下來要做的事情是找出哪些數據會導致多行返回(select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id),並查看是否可以進一步限制此查詢以僅返回一行。如果需要的話,你甚至可以嘗試類似...AND ROWNUM = 1(對於Oracle--其他DB具有類似的限制返回行的方式)。

1
Then (Select name 
     From TABLE3 
     Where acct.acct_id = TABLE3.acct_id 
     Fetch First 1 Rows Only) 

取不接受在CASE語句 - 「關鍵字FETCH預計不會有效令牌:)UNION EXCEPT。」