考虑表格:
public ActionResult Report(Models.ReportRequest[] data)
{
// Handle list of received data
return null;
}
我能做出的最有效的自联接查询是什么,为了产生只返回前3条记录(编号= 1)的记录,考虑条件是日期必须在2016年之前。
例如,文件号2根本不会显示,因为其中一个日期是> 2016年,但是所有3个记录都将显示第1号文件,因为所有3个日期都是< 2016
我尝试了以下内容:
table
no | date
--------------------------------
1 | 2015-03-17 00:00:00.000
1 | 2015-03-17 00:00:00.000
1 | 2015-03-17 00:00:00.000
2 | 2015-03-01 00:00:00.000
2 | 2016-03-01 00:00:00.000
2 | 2016-03-01 00:00:00.000
但是,返回的结果是
SELECT a.no, a.date
FROM table a
INNER JOIN table b ON b.no = a.no AND b.date < '2016' --pseudocode for date comparison
答案 0 :(得分:0)
首先,您可以获取应返回的ID列表,然后使用自联接,如下所示:
select b.*
from table b
join (select id from table group by id having year(max(date)) <2016) x
on (a.no = x.no);
答案 1 :(得分:0)
SELECT t1.* FROM table t1
JOIN
(
SELECT no, max(date) as max_date FROM table
GROUP BY no
HAVING max_date < '2016-01-01'
) t2
ON t1.no = t2.no
答案 2 :(得分:0)
也许我根据您的要求不理解某些事情 - 您不需要自我加入。
例如,文件号2根本不会显示,因为其中一个日期是&gt; 2016年,但是所有3个记录都将显示第1号文件,因为所有3个日期都是&lt; 2016
您需要反加入。
SELECT a.no, a.date
FROM table A
WHERE
NOT EXISTS(
SELECT * FROM table B
WHERE
B.no = A.no
AND B.date < DATE('2016-01-01')
)
答案 3 :(得分:0)
在没有使用JOIN
的情况下,有几种方法可以做到这一点!这是一个:
select * from tbl
where `no` not in
(
select `no` from tbl
where `date` >= '2016-01-01 00:00:00.000'
)