Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 2000 - Fatal编程技术网

SQL左联接:选择最后的记录

SQL左联接:选择最后的记录,sql,sql-server-2000,Sql,Sql Server 2000,我有一个项目表和一个评论表。一个项目可以有很多评论。我想获得所有项目的列表,其中评论发布时间>30天,或者没有评论的项目。实现这一目标的最佳方式是什么 我有过很多失败的尝试;这是我最近一次尝试 SELECT p.id, p.officialStatus, c.posted FROM projects p LEFT JOIN ( SELECT max(posted) as posted,

我有一个项目表和一个评论表。一个项目可以有很多评论。我想获得所有项目的列表,其中评论发布时间>30天,或者没有评论的项目。实现这一目标的最佳方式是什么

我有过很多失败的尝试;这是我最近一次尝试

SELECT p.id, 
       p.officialStatus, 
       c.posted 
  FROM projects p 
       LEFT JOIN 
       (
        SELECT max(posted) as posted, 
                   projectid 
          FROM comments 
             WHERE DATEDIFF(day, posted, GETDATE()) > 30 
                   OR comment IS NULL
               group by projectid
        ) c ON p.id = c.projectid 
 WHERE (p.officialStatus NOT IN ('Blue', 'Canceled'))
请在回答中使用以下表格/列名:

项目:id,officialStatus 注释:id、projectID、postedOn 我认为你的主要问题是外部连接,这正是你不需要的。。。在这个调整中,没有注释的项目将有一个空的max_posted date

SELECT projects.id FROM projects
  LEFT JOIN
    (SELECT comments.projectID 
       FROM comments
      GROUP BY comments.projectID
      HAVING DATEDIFF(Now(), MAX(comments.postedOn)) < 30) AS C
  ON projects.id = C.projectID
  WHERE C.projectID IS NULL;

-还有执行计划,感谢@Barbara在sqlfiddle上准备此测试

我使用的是SQL Server函数DateAdd,它在MySQL或Oracle中不存在,但在这些平台上有等价物。我根据您在示例查询中使用的DateDiff假设了SQL Server。您好,谢谢您的回复。我会尝试一下你的查询,并让你知道结果。我昨天刚发现sqlfiddle,我恋爱了。谢谢你的回复Barbara。对不起,我应该在我的第一个问题中说得更清楚,我运行的是MS SQL 2000,它不识别“当前日期”。有什么建议吗?我同意Wirus+1对sqlfiddle的看法!它现在能识别吗?GetDate怎么样?是的,你抢先了。我还必须为MS SQL的DATEDIFFday、MAXcomments.posted和getdate添加一个附加参数。我将验证数据并让您知道结果。再次感谢你的帮助!再次感谢芭芭拉,返回数据已签出。如果有人对我的工作问题感兴趣。嗨,威勒斯,谢谢你的回复。对不起,我在第一个问题中没有说得更清楚,我正在运行MS SQL 2000,但它不识别“当前日期”。有什么建议吗?我想知道,选择正确答案的标准是什么?其他查询是否错误并返回无效数据?或者他们也很好,但是选择的那个有最好的表现?我认为这个问题的答案可能是你的文章的宝贵成果。
SELECT projects.id FROM projects
  LEFT JOIN
    (SELECT comments.projectID 
       FROM comments
      GROUP BY comments.projectID
      HAVING DATEDIFF(Now(), MAX(comments.postedOn)) < 30) AS C
  ON projects.id = C.projectID
  WHERE C.projectID IS NULL;
select p.*, max(c.postedOn) as postedDate from Projects p
left join Comments c on p.id = c.projectId
group by p.id
having COALESCE( postedDate, DATE_SUB(CURRENT_DATE, INTERVAL 31 DAY ) ) < 
    DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY );