Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取数据(如果已经存在)_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 获取数据(如果已经存在)

Sql 获取数据(如果已经存在),sql,sql-server,tsql,Sql,Sql Server,Tsql,我对SQL查询有问题。我有一个历史记录表,订单记录了状态的所有变化。我想做的是获取具有特定状态的订单 我使用了这个查询: SELECT TOP 1 HistoryDate FROM schema.History WHERE OrderID = 123123 AND OrderStatusID = 10 AND OrderID IN (SELECT TOP 1 OrderID FROM schema.Histor

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

我使用了这个查询:

SELECT TOP 1 
    HistoryDate
FROM 
    schema.History
WHERE 
    OrderID = 123123
    AND OrderStatusID = 10
    AND OrderID IN (SELECT TOP 1 OrderID
                    FROM schema.History
                    WHERE OrderStatusId = 5
                      AND OrderID = 123123)
查询结果满足要求,但我希望避免两次引用同一个表

有什么想法吗

编辑:


我之前没有提到的是,当状态为5和10时,我希望从状态10开始
HistoryDate
,如果没有状态10,我希望为空,当只有状态10时,我还需要状态10的
HistoryDate

通常,如果您想在第二个状态中找到另一条记录,并且找到相同的
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
) 

如果不使用两张桌子,我看不到任何方法可以做到这一点。从逻辑上讲,您定义的是两个集合的交集,这通常意味着两个表或一个联接

@TimSchmelter使用EXISTS的查询是首选的,并且可能会提高性能,但请记住,不使用ORDER BY的
TOP
是不确定的(即不可靠的),因此不能保证您获得最新或最旧的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
是不确定的。我强烈建议您按h1.HistoryDate添加一个
订单
或按h1.HistoryDate DESC添加一个
订单
,或者如果任何订单有多个OrderStatusID为
10
的历史日期,您可能会得到意想不到的结果,而不是子查询(OrderStatusID=10或OrderStatusID=5),在我的表中,有许多条目连接到一个orderId,不同的是OrderStatusID您似乎想要查找具有特定状态的订单,但现在有了不同的订单。您可以随时获取特定顺序的所有历史记录,然后在代码中检查差异。@Mihai:添加或可能有帮助,但如果历史记录中只有状态5会怎么样?我不想要任何结果,状态10和5必须存在你想要什么具体状态?