1

我正在尝试使用 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 的新手。

4

5 回答 5

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 添加到您的子查询来做到这一点。

于 2010-07-29T18:29:00.920 回答
1
Then ( Select name 
       From TABLE3 
       Where acct.acct_id = TABLE3.acct_id
       Fetch First 1 Rows Only) 

CASE 语句中不接受 Fetch -“关键字 FETCH 不是预期的。有效标记:) UNION EXCEPT。”

于 2011-02-22T17:26:02.757 回答
0
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id

将为您提供表 3 中的所有名称,这些名称在表 1 中有一行。从上一行中的表 2 中选择的行不进入它。

于 2010-07-29T18:29:36.313 回答
0

必须获得多个值。

你可以用...替换身体

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

...缩小返回倍数的行。

在这种情况下,您可能只需要 aDISTINCT或 aTOP 1来减少您的结果集。

祝你好运!

于 2010-07-29T18:29:38.503 回答
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 - 其他数据库有类似的方法来限制返回的行)。

于 2010-07-29T18:35:35.587 回答