【发布时间】: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)。这里有什么难闻的气味。这真的行不通,不是吗?