这里是否需要嵌套查询?

时间:2011-06-22 11:11:24

标签: sql sql-server-2008

假设我有一张存储比赛结果的表格。每天,有几辆赛车在赛道上比赛,我记录了位置。 (这是一个严格的简化,但它得到了重点)

表格如下:

|Driver | Position | Date
 Andy     1          22/06/2011
 Paul     2          22/06/2011
 Cliff    3          22/06/2011
 Andy     2          21/06/2011
 Paul     1          21/06/2011
 Cliff    3          21/06/2011

等等......

我想写一个查询,它返回给定日期的驾驶员位置,以及前一天的位置。我想要返回以下列:

|Driver | Position | Date       | Position Yesterday
 Andy     1          22/06/2011   2
 Paul     2          22/06/2011   1
 Cliff    3          22/06/2011   3

我认为我必须写一个嵌套查询,但我真的不知道从哪里开始。我知道我可以多次调用数据库并在我的应用程序中构建结果,但我觉得这不是最佳实践。

8 个答案:

答案 0 :(得分:4)

SELECT
  [today].*,
  [yesterday].Position
FROM
  yourTable AS [today]
LEFT JOIN
  yourTable AS [yesterday]
    ON  [today].Driver = [yesterday].Driver
    AND [today].Date   = [yesterday].Date + 1
WHERE
  [today].Date = '22/06/2011'

答案 1 :(得分:4)

你可能会像这样离开加入:

select
  r1.driver,
  r1.position,
  r1.date
  r2.position as prev_pos
from
  results r1
left join
  results r2 on r1.driver = r2.driver and r2.date = r1 - INTERVAL 1 DAY;

答案 2 :(得分:2)

嵌套似乎表现更好(感谢@Dems的评论) 通过过滤日期自我加入表。使用和索引(驱动程序,日期)组合

SELECT t1.Driver,t1.Position, t1.Date, t2.Position
FROM table t1
LEFT JOIN (SELECT Driver, Position FROM table ON t1.Driver = t2.Driver AND t2.date ='21/06/2001') ON t1.Driver = t2.Driver
WHERE t1.date = '22/06/2011' 

答案 3 :(得分:1)

如果您使用的是MS SQL Server 2008,请查看Common Table Expressions

答案 4 :(得分:0)

您可以使用UNION,对第二个查询的第一个结果UNION结果使用一个查询。这应该以正确的方式返回:

SELECT * FROM * WHERE =

UNION

SELECT * FROM * WHERE =

根据您的需要填写*。

答案 5 :(得分:0)

您可以通过加入来搜索前一天。

答案 6 :(得分:0)

我无法在此处测试SQL查询,但这里有一些伪SQL代码,如果转换为正确的SQL可能会有效:

SELECT
  today.driver,
  today.position,
  today.date,
  yesterday.position
FROM
  your_table today,
  ( SELECT driver, position, ( date - 1 day ) "date" FROM your_table ) yesterday
WHERE
  today.driver = yesterday.driver AND
  today.date = yesterday.date

当然,这不是编译,我不是100%肯定where子句。您可能需要执行一些左/右外连接。此外,当最后一场比赛不是昨天,而是前一天,你会遇到问题。

希望这无论如何都有帮助。

答案 7 :(得分:0)

另一种选择:

@givendate = '22/06/2011'

SELECT t1.Driver
     , t1.Position
     , t1.Date
     , ( SELECT t2.Position
         FROM table t2
         WHERE t2.Driver = t1.Driver
           AND t2.date = DATEADD(day, @givendate, -1)
       ) AS PositionYesterday
FROM table t1
WHERE t1.date = @givendate