结果计数错误

时间:2014-09-17 19:24:41

标签: sql sql-server stored-procedures

我想得到没有为当前日期保留的表的数量,因为我写了这个存储过程,但总是给我0。

USE [RestaurantProject]
GO
/****** Object:  StoredProcedure [dbo].[sp_GetAvailableTables]    Script Date: 9/17/2014 3:00:43 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_GetAvailableTables] 
AS
BEGIN
    SET NOCOUNT ON;
    SELECT COUNT(t.TableID) AS TableCount
    FROM Tables t
    INNER JOIN Orders o
    ON t.TableID <> o.TableID
    WHERE o.OrderDate < GETDATE()

END

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您的join就会搞砸了。我认为你最好使用not exists

SELECT COUNT(*)
FROM Tables t
WHERE NOT EXISTS (
    select *
    from orders o
    where o.tableid = t.tableid and o.orderdate < getdate())

注意:这可能无法返回正确的结果。取决于orders表中的数据。您可能希望使用o.orderdate > getdate()代替<。这将为您提供所有没有预留大于getdate()的表格。

答案 1 :(得分:1)

试试这个

SELECT COUNT(t.TableID) AS TableCount
FROM Tables t
left JOIN Orders o ON t.TableID = o.TableID and o.OrderDate = GETDATE()
where o.TableID is null

我已将所有逻辑移入join子句,然后过滤掉不匹配的记录。

我们所说的是:

向我提供所有订单日期为今天没有订单的表格。

这将比查询更好,因为它有一个较小的结果集可以过滤。

如果我是你,我会把你要检查的日期作为参数传递,这个sp将会返回不同的结果,具体取决于你何时调用它,这将使你以后的生活变得困难如果你想要重现结果。