用case执行子查询

时间:2017-04-17 09:24:04

标签: sql-server

我必须在子查询中运行带有case语句的子查询。当我独立运行子查询时,它可以工作,但作为子查询,它会产生以下错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

这是我的疑问:

select categoryid, categoryname, (select (case when c.ParentCategoryId is NULL then null else c.CategoryName end) as Parent_Category_Name from Categories c) from Categories

我的类别表有3列:CategoryId,CategoryName,ParentCategoryId

我无法弄清楚如何获取所需的结果。

4 个答案:

答案 0 :(得分:1)

这很可能是您需要对查询执行的操作:

select 
    C1.categoryid, 
    C1.categoryname,
    case 
        when c1.ParentCategoryId is NULL 
        then null 
        else c2.CategoryName 
    end as Parent_Category_Name 
from Categories C1 
left join Categories C2
on C1.ParentCategoryID=C2.CategoryID

您的子查询有效并可帮助您查找所有类别的parent_category_name。 你不需要重复整个过程来将这个逻辑集成到其他查询中;只要选择部分就足够了。

更简单地说,您不需要使用JOIN进行案例评估。

select 
    C1.categoryid, 
    C1.categoryname,
    c2.CategoryName as Parent_Category_Name 
from Categories C1 
left join Categories C2
on C1.ParentCategoryID=C2.CategoryID

答案 1 :(得分:1)

您的子查询

(select (case when c.ParentCategoryId is NULL then null else c.CategoryName end) as Parent_Category_Name 
from Categories c)

将返回所有类别,它会导致问题。 据我了解,您的查询应该是:

select c.categoryid, c.categoryname, 
CASE 
     when c.ParentCategoryId IS NULL then '' 
     ELSE pr.categoryname
END as Parent_Category_Name
from Categories c
LEFT JOIN Categories pr ON c.ParentCategoryId = pr.categoryid

答案 2 :(得分:0)

在子查询中指定Top(1)。它似乎返回多个不被接受为子查询结果的值。

select categoryid, categoryname, (select TOP(1) (case when c.ParentCategoryId is NULL then null else c.CategoryName end) as Parent_Category_Name from Categories c) from Categories

答案 3 :(得分:0)

试试这个。

select categoryid, categoryname, case when c.ParentCategoryId is NULL then null else c.CategoryName end as Parent_Category_Name from Categories