Sql server 子查询返回了多个值SQL错误
当我尝试执行此查询时,我收到以下错误 我试图做的是,如果用户ID属于供应商(来自用户ID),则显示供应商描述,否则显示客户描述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,
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。
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
子查询的情况下执行此查询。是否可以简单地使用联接,但也有条件?现在将编辑问题。