Sql server 子查询返回了多个值SQL错误

Sql server 子查询返回了多个值SQL错误,sql-server,Sql Server,当我尝试执行此查询时,我收到以下错误 我试图做的是,如果用户ID属于供应商(来自用户ID),则显示供应商描述,否则显示客户描述 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。 SELECT status_history.date, status_history.doc_type, status_history.document_id, user.email, doctypes.description,

当我尝试执行此查询时,我收到以下错误

我试图做的是,如果用户ID属于供应商(来自用户ID),则显示供应商描述,否则显示客户描述

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。

 SELECT status_history.date,
       status_history.doc_type,
       status_history.document_id,
       user.email,
       doctypes.description,
       orders.order_no
       document_no,
       (SELECT CASE
                 WHEN status_history.id = orders.from_id THEN
                 old_status.supplier_description
                 ELSE old_status.customer_description
               END AS old_status_desc
        FROM   status_history
        WHERE  status_history.link_number = 821
               AND status_history.id = user.id
               AND status_history.doc_type =
                   doctypes.doc_type
               AND status_history.old_status_id = old_status.status_id
               AND status_history.new_status_id = new_status.status_id) AS
       old_status_desc,
       (SELECT CASE
                 WHEN status_history.id = orders.from_id THEN
                 new_status.supplier_description
                 ELSE new_status.customer_description
               END AS new_status_desc
        FROM   status_history
        WHERE  status_history.link_number = 821
               AND status_history.id = user.id
               AND status_history.doc_type =
                   doctypes.doc_type
               AND status_history.old_status_id = old_status.status_id
               AND status_history.new_status_id = new_status.status_id) AS
       new_status_desc
FROM   status_history,
       user,
       doctypes,
       qc_status old_status,
       qc_status new_status,
       orders
WHERE  status_history.link_number = 821
       AND status_history.id = user.id
       AND status_history.doc_type = doctypes.doc_type
       AND status_history.old_status_id = old_status.status_id
       AND status_history.new_status_id = new_status.status_id
       AND orders.quote_id = status_history.document_id
       AND status_history.doc_type = 1
ORDER  BY status_history.date,
          status_history.doc_type  
编辑:

此查询的结果用于显示订单具有不同状态的模式。所以它显示了一个订单,比如New->Saved

我有两种类型的用户供应商和客户,作为供应商,您可以看到供应商的状态描述视图,反之亦然

例如,如果我查看订单的供应商状态,它将显示Saved->Sent;如果我查看订单的客户状态,它将显示Saved->Received


无论何时创建订单,它都会在status_history表中插入一条记录,其中一条记录针对供应商,另一条记录针对客户。然后,我对订单使用用户id。从用户id确定要获得正确描述的用户类型。

您可以取消子查询,使用
CTE
,如下所示:

 WITH CTE
 AS
 (
     SELECT status_history.id, CASE
            WHEN status_history.id = orders.from_id THEN
            old_status.supplier_description
            ELSE old_status.customer_description
        END AS old_status_desc,
        CASE
            WHEN status_history.id = orders.from_id THEN
            new_status.supplier_description
            ELSE new_status.customer_description
        END AS new_status_desc
     FROM   status_history
     WHERE  status_history.link_number = 821
       AND status_history.id = user.id
       AND status_history.doc_type =  doctypes.doc_type
       AND status_history.old_status_id = old_status.status_id
       AND status_history.new_status_id = new_status.status_id
 )
 SELECT status_history.date,
       status_history.doc_type,
       status_history.document_id,
       user.email,
       doctypes.description,
       orders.order_no
       document_no,
       c.old_status_desc,
       c.new_status_desc
FROM   status_history
INNER JOIN user ON status_history.id = user.id
INNER JOIN doctypes status_history.doc_type = doctypes.doc_type
INNER JOIN qc_status old_status ON status_history.old_status_id = old_status.status_id
INNER JOIN qc_status new_status ON status_history.new_status_id = new_status.status_id
INNER JOIN orders ON orders.quote_id = status_history.document_id
INNER JOIN CTE AS c ON status_history.id = c.id
WHERE  status_history.link_number = 821 AND status_history.doc_type = 1
ORDER  BY status_history.date,
          status_history.doc_type;

这将删除错误消息,但每行的状态都会重复。在这种情况下,您可能需要使用group by的聚合函数,以便为每行仅获取一个状态。

错误消息非常清楚。至少在某些情况下,您的
CASE
子查询返回的信息多于record。此外,您正在使用过时的隐式联接语法,这使得查看查询的操作更加困难。@TimBiegeleisen我一直在尝试如何在不使用
CASE
子查询的情况下执行此查询。是否可以简单地使用联接,但也有条件?现在将编辑问题。