我试图使用案例陈述,但不断收到错误。这是声明:
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 :(得分: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添加到子查询中来实现。
答案 1 :(得分:1)
Then ( Select name
From TABLE3
Where acct.acct_id = TABLE3.acct_id
Fetch First 1 Rows Only)
在CASE语句中不接受Fetch - “不期望关键字FETCH。有效令牌:”UNION EXCEPT。“
答案 2 :(得分:0)
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id
将为您提供表3中的所有名称,这些名称在表1中具有附带的行。从上一行中的表2中选择的行不会进入该行。
答案 3 :(得分:0)
必须获得多个值。
您可以用...替换身体
(select count(name) from TABLE3 where TABLE1.acct_id = TABLE3.acct_id)
...缩小哪些行返回多个。
您可能只需要DISTINCT
或TOP 1
来减少结果集。
答案 4 :(得分:0)
我认为这里发生的事情是你的案例必须返回一个值,因为它将是“name”列的值。子查询(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有类似的方法来限制返回的行)。