2012-07-25 22 views
0

可我想写这个问题的查询:查询找到所有天没有在表中

显示在1997年8月的日子里,没有订单被放置。

我能找到订单被放置的日子,但我怎么能找到没有订单的日子呢?

这说明当天的订单放在:

SELECT 
    o.OrderID, 
    day(o.OrderDate) AS 'Date', 
    sup.CompanyName 
FROM 
    Orders o 
    INNER JOIN OrderDetails od ON o.OrderID = od.OrderID 
    INNER JOIN Products p ON od.ProductID = p.ProductID 
    INNER JOIN Suppliers sup ON p.SupplierID = sup.SupplierID 
WHERE 
    sup.CompanyName = 'Tokyo Traders' 
    AND o.OrderDate BETWEEN '1/1/1997' AND '1/31/1997' 
+2

您正在使用哪些DBMS? PostgreSQL的?甲骨文? DB2? – 2012-07-25 20:01:25

+0

@ErikE - 不是真的,原来的帖子明确提出'写一个查询来显示1997年8月的那天没有任何订单放置的日子,这似乎是从另一个来源复制粘贴的 – LittleBobbyTables 2012-07-25 20:12:04

+0

@LittleBobbyTables你是right – ErikE 2012-07-25 20:15:56

回答

2

你需要一个日期表,你可以加入对寻找失踪的日期。

假设它的SQL Server:

您可以加入您的查询对这种获取结果

WITH DatesTable 
AS 
(
    SELECT CAST('2007-08-01' as datetime) AS [date] 
    UNION ALL 
    SELECT DATEADD(dd, 1, [date]) 
    FROM DatesTable 
    WHERE DATEADD(dd, 1, [date]) <= '2007-08-31' 
) 
SELECT [date] FROM DatesTable 
OPTION (MAXRECURSION 0); 

类似

WITH DatesTable 
AS 
(
    SELECT CAST('2007-08-01' as datetime) AS [date] 
    UNION ALL 
    SELECT DATEADD(dd, 1, [date]) 
    FROM DatesTable 
    WHERE DATEADD(dd, 1, [date]) <= '2007-08-31' 
) 
SELECT DT.[date] 
FROM 
    DatesTable DT 
    Left Outer Join Orders o on o.OrderDate = DT.[Date] 

WHERE o.OrderDate is null 

OPTION (MAXRECURSION 0); 
+0

我也在想同样的事情..... thanx buddy – ashi 2012-07-25 20:12:34

+0

很高兴这很有帮助。 – YetAnotherUser 2012-07-25 20:17:39

0

跨数据库的方式做一些事情这是为每个日期创建一个包含一行的表,然后将它连接到您的详细表;空值是没有匹配的地方。

0

假设的SQL Server:

WITH Dts AS (
    SELECT DateAdd(day, V.number, '19970801') Dt 
    FROM master.dbo.spt_values V 
    WHERE V.type = 'P' 
    AND V BETWEEN 1 AND 31 
) 
SELECT Dts.Dt 
WHERE NOT EXISTS (
    SELECT * 
    FROM 
     Orders o 
     INNER JOIN Suppliers sup ON p.SupplierID = sup.SupplierID 
    WHERE 
     sup.CompanyName = 'Tokyo Traders' 
     AND Dts.Dt = o.OrderDat 
) 

我留在公司名称的条件,因为我相信你想天那Tokyo Traders没有下订单。

相关问题