【问题标题】:Subquery returning more than one value per row子查询每行返回一个以上的值
【发布时间】:2019-12-23 21:10:09
【问题描述】:

我有一个返回多行的子查询,这是我需要的。但我得到了错误:

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

我的查询如下所示:

SELECT 
    number, 
    req.dv_cat_item, 
    req.dv_stage, 
    req.dv_state req_state, 
    u.dv_u_lob, 
    u.dv_location,
    req.opened_at,
    req.closed_at, 
    req.dv_closed_by,
    (SELECT name FROM sc_item_option vars
     OUTER APPLY STRING_SPLIT(vars.value, ',') s
     LEFT JOIN cmdb_ci_server AS c ON c.sys_id =s.value
     JOIN sc_item_option_mtom mtom ON vars.sys_id = mtom.sc_item_option
     JOIN sc_req_item req ON mtom.request_item = req.sys_id 
     WHERE mtom.request_item = req.sys_id 
       AND item_option_new = '915ec43a13ff520012c73482e144b002') --as [Server]
FROM 
    sc_req_item req
JOIN 
    sys_user u ON u.sys_id = req.u_requested_for
               AND req.dv_cat_item = 'system id request' 
               AND req.sys_id IN ('a0880b7c1bb1c41c5c68b8061a4bcb99', '6a066d111bb14cd0fafc1f861a4bcb2b')

我尝试使用 where exists 并且尝试将该子查询移到最后 4 行之下。到目前为止没有运气。

谁能帮忙?

谢谢

【问题讨论】:

  • 您希望如何表示多行?
  • 您在外部查询和子查询中都有表和别名sc_req_item AS req。您是否打算将子查询与外部查询相关联?当您说您需要子查询来返回多个结果时,似乎您需要关联它,或者您想要重复的行。哪个是正确的?
  • @GordonLinoff,嗨,戈登,我想要多行/重复行
  • @EricBrandt,我想让其他列在另一行中重复。我是 SQL 新手,所以我不确定在这种情况下是什么相关性。我会仔细阅读的。

标签: sql sql-server subquery


【解决方案1】:

为此,你必须确保子查询返回一个值。 如果它返回多个 sql 将不知道选择哪一个作为结果 我相信这是你应该做的:

SELECT number
    ,req.dv_cat_item
    ,req.dv_stage
    ,req.dv_state req_state
    ,u.dv_u_lob
    ,u.dv_location
    ,req.opened_at
    ,req.closed_at
    ,req.dv_closed_by
    ,b.name
FROM sc_req_item req
JOIN sys_user u ON u.sys_id = req.u_requested_for
    AND req.dv_cat_item = 'system id request'
    AND req.sys_id IN (
        'a0880b7c1bb1c41c5c68b8061a4bcb99'
        ,'6a066d111bb14cd0fafc1f861a4bcb2b'
        )
INNER JOIN (
    SELECT name
        ,request_item
    FROM sc_item_option vars
    OUTER APPLY STRING_SPLIT(vars.value, ',') s
    LEFT JOIN cmdb_ci_server AS c ON c.sys_id = s.value
    JOIN sc_item_option_mtom mtom ON vars.sys_id = mtom.sc_item_option
    JOIN sc_req_item req ON mtom.request_item = req.sys_id
    WHERE item_option_new = '915ec43a13ff520012c73482e144b002'
    ) b ON b.request_item = req.sys_id

【讨论】:

  • 这会返回一个错误并且 b.reuquest_iem 带有红色下划线。谢谢。
  • 嗨,Chrissy,我更正了代码。子查询中名称后遗漏了 request_item。让我知道它现在是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多