获取数据(如果已存在)

时间:2015-11-16 12:55:02

标签: sql sql-server tsql

我的SQL查询有问题。我有一个历史表,订单记录了所有状态的变化。我想要做的是获得具有特定地位的订单。

我使用了这个查询:

HistoryDate

查询结果满足,但我想避免两次引用同一个表。

有什么想法吗?

编辑:

之前我没有提到过的事实是,当状态为5和10时,我想要状态10中的HistoryDate,如果没有状态10,我想要NULL,并且当只有状态10时我也想要状态10的$original_image

2 个答案:

答案 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.HistoryDateORDER BY h1.HistoryDate DESC,否则如果订单的多个历史日期与OrderStatusID为10,您可能会收到意外结果。