2016-07-25 70 views
0

如何获得courseName ='Music'的最新日期?使用同一个对象名称获取最新记录

courseName  | dateOfEnrollment 
----------------|----------------------- 
Music   | 2016-07-24 
Art    | 2016-07-01 
Art    | 2016-07-23 
Music   | 2016-07-25 

当我用下面的语句尝试以下

SELECT courseName, dateOfEnrollment FROM MyDatabase.dbo.courseEnrollment WHERE courseName = 'Music' AND GETDATE() >= MAX(dateOfEnrollment) 

返回错误:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference. 

我的最终目标是把这一声明在IF语句,如果它不为空,那么我会在表格中插入新的数据。

更新(我回答):

这是为我工作:

IF EXISTS (SELECT TOP 1 courseName, dateOfEnrollment FROM courseEnrollment WHERE courseName = 'Music' ORDER BY dateOfEnrollment DESC) 
    *Insert data into the table* 

ELSE 
    *No need to insert* 

回答

4
SELECT 
    courseName, 
    dateOfEnrollment 
FROM 
    MyDatabase.dbo.courseEnrollment 
WHERE 
    courseName = 'Music' 
ORDER BY 
    dateOfEnrollment 
LIMIT 1 

那是你的查询如何模样,但假设你的主要目标 - 你只需要检查是否有任何“音乐”行,你根本不应该对dateOfEnrollment列感兴趣。我是对还是错过了什么?

所以你的最终查询(插入取决于条件的行)将是:

INSERT INTO courseEnrollment 
SELECT 'Music', CURDATE() FROM courseEnrollment 
WHERE courseName = 'Music'; 
+0

如果有两个或两个以上的记录包含最新的同一天又是什么情况? – Sadikhasan

+0

在那里发现两个问题。 1)'ORDER BY dateOfEnrollment'意思是'日期的升序(但预期是降序)'2)如果'Music'下有多个条目具有最新日期,那么输出中将始终为1。 – 1000111

+0

嗨@Damiano,谢谢你的回复。我可以知道如何将整个查询放入IF语句中?假设没有结果返回,那么表不会被更新。否则更新表格。 – YWah

0

你可以试试看:

SELECT 
CE.* 
FROM courseEnrollment CE 
INNER JOIN 
(
    SELECT 
     courseName, 
     MAX(dateOfEnrollment) max_enrollment_date 
    FROM courseEnrollment 
    WHERE courseName ='Music' 
) t 
ON CE.courseName = t.courseName AND CE.dateOfEnrollment = t.max_enrollment_date; 

注:这样做的输出查询可能包含多个条目,如果Music课程中有多个条目具有最新日期。


TEST:

CREATE TABLE courseEnrollment (
    courseName VARCHAR (100), 
    dateOfEnrollment date 
); 

INSERT INTO courseEnrollment (
    courseName, 
    dateOfEnrollment 
) 
VALUES 
    ('Music', '2016-07-24'), 
    ('Art', '2016-07-01'), 
    ('Art', '2016-07-23'), 
    ('Music', '2016-07-25'); 

运行在这些给定的数据上面的查询,你会得到一个输出象下面这样:

输出:

courseName  dateOfEnrollment 
Music    2016-07-25 

编辑:

WORKING DEMO