Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
列出在另一组记录的x小时内发生的所有SQL记录_Sql_Sql Server_Select_Nested Sets_Self Join - Fatal编程技术网

列出在另一组记录的x小时内发生的所有SQL记录

列出在另一组记录的x小时内发生的所有SQL记录,sql,sql-server,select,nested-sets,self-join,Sql,Sql Server,Select,Nested Sets,Self Join,我已经接近了吗? 我试图列出所有包含“猿”的记录。。。以及所有的 在任何“Ape”记录之前x天出现的记录。 我想我需要一个自联接表 -- Doesn't work: SELECT tblA.MyDate, tblA.MyPet FROM TestTable As tblA WHERE tblA.MyPet='Ape' UNION SELECT tblA.MyDate, tblA.MyPet FROM TestTable AS tblA, TestTa

我已经接近了吗?
我试图列出所有包含“猿”的记录。。。以及所有的 在任何“Ape”记录之前x天出现的记录。 我想我需要一个自联接表

-- Doesn't work:
SELECT tblA.MyDate, tblA.MyPet  FROM TestTable As tblA                      WHERE tblA.MyPet='Ape'
UNION
SELECT tblA.MyDate, tblA.MyPet  FROM TestTable AS tblA, TestTable AS tblB   WHERE tblA.MyPet='Ape' AND tblA.MyDate>tblB.MyDate-0.5 AND tblA.MyDate<tblB.MyDate
ORDER BY tblA.MyDate ASC

-- Doesn't work:
SELECT * FROM TestTable As tblA     INNER JOIN TestTable As tblB ON tblA.MyPet =         'Ape'     AND tblA.MyDate>tblB.MyDate-1  AND tblA.MyKey>tblB.MyKey

-- Doesn't work:
SELECT * FROM TestTable WHERE MyDate IN (SELECT MyDate-1 FROM TestTable WHERE MyPet='Ape')

-- Doesn't work
SELECT id, uid, date FROM orders current
WHERE EXISTS 
(
   SELECT * from orders future 
   WHERE future.date < DateAdd(DAYS, 1, current.date)
   AND future.date > getdate()
   AND future.uid = current.uid
)

-- Doesn't work
SELECT * FROM TestTable AS tblA
WHERE EXISTS
( 
   SELECT * FROM TestTable AS tblB
   WHERE tblB < DateAdd(DAYS, 1, tblA.MyDate)
   AND tblB.MYDate > GetDate()
   AND tblA.MyKey = tblB.MyKey
)
  • 过程:分别编写查询的每一半,并进行测试以确保其正常工作。然后将它们与一个联盟结合在一起
  • 如果要删除重复项,请使用UNION ALL而不是UNION
  • 这就是你想要的:

    SELECT DISTINCT
        tblA.*
    FROM TestTable AS tblA
        INNER JOIN TestTable AS tblB
            ON (tblA.MyDate >= DATEADD(day, -1, tblB.MyDate)) AND (tblA.MyDate <= tblB.Mydate) AND (tblB.MyPet = 'Ape');
    
    选择DISTINCT
    tblA*
    作为tblA从测试表中删除
    内部联接测试表作为tblB
    在(tblA.MyDate>=DATEADD(day,-1,tblB.MyDate))和(tblA.MyDate

    查询1

    -- Doesn't work:
    SELECT tblA.MyDate, tblA.MyPet  
    FROM TestTable As tblA
    WHERE tblA.MyPet='Ape'
    UNION all
    SELECT tblA.MyDate, tblA.MyPet  
    FROM TestTable AS tblA
    WHERE dateadd(day, 1, tblA.MyDate) < (select min(MyDate) from TestTable where MyPet = 'Ape')
    ORDER BY tblA.MyDate ASC
    
    |                          MYDATE |  MYPET |
    --------------------------------------------
    | December, 01 2012 06:12:10+0000 |    Cat |
    | December, 01 2012 10:11:10+0000 |    Dog |
    | December, 01 2012 14:13:10+0000 |   Fish |
    | December, 01 2012 16:14:10+0000 |   Duck |
    | December, 01 2012 17:15:10+0000 |   Bird |
    | December, 01 2012 20:16:10+0000 | Kitten |
    | December, 02 2012 01:17:10+0000 |    Dog |
    | December, 02 2012 12:19:10+0000 |   Fish |
    | December, 02 2012 13:20:10+0000 |   Duck |
    | December, 02 2012 14:21:10+0000 |   Bird |
    | December, 03 2012 14:25:10+0000 |    Ape |
    | December, 06 2012 16:40:10+0000 |    Ape |
    
    编辑

    如果您需要在第一次Ape记录之前的x天内发生的记录 那么查询应该是(在示例x=1中)


    我认为您正在寻找的公式是:

    SELECT *
    FROM TestTable tblA
    WHERE EXISTS (SELECT *
                  FROM TestTable tblB
                  WHERE tblB.mydate between tblA.MyDate - X and tblA.MyDate and
                        tblB.MyPet = 'Ape'
                 )
    
    两个注意事项。首先,这使用了语法“date-x”,当date是
    datetime
    而不是
    date
    时,该语法起作用。它相当于
    dateadd(day,-x,tbla.MyDate)

    其次,这将返回所有带有“Ape”的记录,因为
    between
    处理相等


    Jesse的查询使用外部连接和distinct实现了本质上相同的功能。

    我不知道如何“编写两个部分”。(“然后用UNION连接它们”是最简单的部分。)代码+结果列出的记录比任何“ape”记录的前一天还要早(我看到12月3日的ape…然后是12月1日的记录。)…我对此进行了投票,但准确地说,它应该是
    选择distinct tblA.
    ,因为当多个记录匹配时,您将获得重复的记录。您不需要
    外部联接(您没有),因为原始记录将始终匹配。@GordonLinoff我将使用
    distinct
    更新答案。谢谢!
    SELECT tblA.MyDate, tblA.MyPet  
    FROM TestTable As tblA
    WHERE tblA.MyPet='Ape'
    UNION
    SELECT tblA.MyDate, tblA.MyPet  
    FROM TestTable AS tblA
    WHERE (select min(MyDate) from TestTable where MyPet = 'Ape') between tblA.MyDate and dateadd(day, 1, tblA.MyDate)
    ORDER BY tblA.MyDate ASC
    
    SELECT *
    FROM TestTable tblA
    WHERE EXISTS (SELECT *
                  FROM TestTable tblB
                  WHERE tblB.mydate between tblA.MyDate - X and tblA.MyDate and
                        tblB.MyPet = 'Ape'
                 )