【问题标题】:Subquery to Join to understand why subquery is returning more than a single value子查询加入以了解为什么子查询返回多个值
【发布时间】:2019-12-10 06:11:10
【问题描述】:

我有这个问题。当子查询的输出是单个值时,它运行良好;否则,它显然会引发错误,因为它不能等同于@n。数据库之间的错误不一致。 (错误信息:

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

)

解决此问题的最简单方法是从子查询中获取 TOP 1。但是,在决定应用它之前,我想了解数据以及导致子查询在某些数据库中输出单个值的原因,但它是多个使其在其他数据库中失败。在这样做时,我试图将子查询转换为连接以了解甚至查看是否有更好的解决方法。任何人都可以帮助我将其转换为加入吗?和/或提出错误的解决方案?谢谢。

SELECT a.clientid
FROM Clients a
JOIN Ordert b ON a.orderid = b.orderid
WHERE b.deleted=0
    AND b.notifyend=1
    AND (SELECT 
           DATEDIFF(d, CONVERT(Date, GetDate()), CONVERT(Date, c.shipped_on)) 
         FROM shipping c 
         WHERE c.shipping_id = b.shipping_id 
          AND  DATEDIFF(minute,0, c.shipped_on)= 
              (SELECT max(DATEDIFF(minute,0, d.shipped_on)) 
               FROM shipping d 
               WHERE  d.shipping_id = b.shipping_id)) =  @n   

【问题讨论】:

  • 样本数据、预期结果和逻辑解释都会有所帮助。
  • 在 Gordon 看来,如果您尝试回答这个问题,Why should I provide a Minimal Reproducible Example for a very simple SQL query?,您很有可能也会回答您自己的问题。不过,至少,您会想出一些示例数据,我们可以使用这些数据来重现您的问题。
  • 第一个子查询 (SELECT DATEDIFF(d,...) 返回多行,然后您想使用相等比较器 (= @n)。这里有什么难闻的气味。这真的行不通,不是吗?

标签: sql tsql join subquery


【解决方案1】:

我在下面对其进行了重构以使用连接,但您似乎想要的是日期差异表达式 datadiff 的所有具有最大值的行,这应该与 OLDEST 相同——如果是这种情况,有更好的使用方法ROW_NUMBER()

WITH maxByID AS
(
  select  shipping_id,  max(DATEDIFF(minute,0, shipped_on) as mmax
  FROM shipping
)
SELECT a.clientid
FROM Clients a
JOIN Ordert b ON a.orderid = b.orderid
JOIN maxByID m ON b.shipping_id = m.shipping_id
JOIN shipping c ON c.shipping_id = b.shipping_id and DATEDIFF(minute,0, c.shipped_on) = m.mmax 
WHERE b.deleted=0  AND b.notifyend=1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多