我的SQL查询有问题。我有一个历史表,订单记录了所有状态的变化。我想要做的是获得具有特定地位的订单。
我使用了这个查询:
HistoryDate
查询结果满足,但我想避免两次引用同一个表。
有什么想法吗?
编辑:
之前我没有提到过的事实是,当状态为5和10时,我想要状态10中的HistoryDate
,如果没有状态10,我想要NULL,并且当只有状态10时我也想要状态10的$original_image
。
答案 0 :(得分:0)
通常,如果要在第二个状态和相同的OrderID
中找到另一个记录,则必须使用子查询。但你可以使用EXISTS
,我认为这更清晰:
SELECT TOP 1 h1.HistoryDate
FROM schema.History h1
WHERE h1.OrderID = @OrderID
AND h1.OrderStatusID = 10
AND EXISTS
(
SELECT 1 FROM schema.History h2
WHERE h1.OrderID = h2.OrderID
AND h2.OrderStatusID = 5
)
答案 1 :(得分:0)
如果不使用两个表,我认为没有办法做到这一点。从逻辑上讲,您定义了两个集合的交集,这通常意味着两个表或一个连接。
@ TimSchmelter对EXISTS的查询是首选,并且可以提高性能,但请记住,TOP
没有ORDER BY
是不确定的(即不可靠),因此您无法保证获得最新或最早的HistoryDate。您只需保证 a HistoryDate。
如果您只是不想要子查询,则可以进行自我加入:
SELECT TOP 1 h1.HistoryDate
FROM schema.History h1
INNER JOIN schema.History h2
ON h1.OrderID = h2.OrderID
WHERE h1.OrderID = 123123
AND h1.OrderStatusID = 10
AND h2.OrderStatusId = 5
根据您的设置,可能会表现更好或可能表现更差,尽管应该执行相同的操作。
尽管如此,TOP
没有ORDER BY
是不确定的。我强烈建议您添加ORDER BY h1.HistoryDate
或ORDER BY h1.HistoryDate DESC
,否则如果订单的多个历史日期与OrderStatusID为10
,您可能会收到意外结果。