id refid date1 date2 nextdate
5 10 2008-02-21 2009-02-21 004/2008
6 10 2009-02-09 2010-02-09 002/2009
7 10 2010-02-08 2011-02-08 001/2010
10 11 2007-02-15 2008-02-15 002/2007
11 11 2008-02-21 2009-02-21 001/2008
12 11 2009-02-09 2010-02-09 001/2009
13 11 2010-02-09 2011-02-09 002/2010
14 11 2011-07-19 2012-07-19 054/2011
15 11 2012-07-17 2014-07-17 066/2012
18 14 2007-02-15 2008-02-15 006/2007
25 16 2007-02-15 2008-02-15 004/2007
27 16 2009-02-10 2010-02-10 004/2009
28 16 2010-02-12 2011-02-12 005/2010
29 16 2011-07-26 2012-07-26 055/2011
30 16 2012-07-18 2014-07-18 067/2012
我有这个数据表。我需要执行以下操作的查询: 返回refid的所有行,其中date2值大于2014-01-01(如果有id,那么我需要所有id)
结果应该是这样的:
id refid date1 date2 nextdate
10 11 2007-02-15 2008-02-15 002/2007
11 11 2008-02-21 2009-02-21 001/2008
12 11 2009-02-09 2010-02-09 001/2009
13 11 2010-02-09 2011-02-09 002/2010
14 11 2011-07-19 2012-07-19 054/2011
15 11 2012-07-17 2014-07-17 066/2012
25 16 2007-02-15 2008-02-15 004/2007
27 16 2009-02-10 2010-02-10 004/2009
28 16 2010-02-12 2011-02-12 005/2010
29 16 2011-07-26 2012-07-26 055/2011
30 16 2012-07-18 2014-07-18 067/2012
答案 0 :(得分:4)
这是非常基本的,但如果我理解正确的话:
DELETE FROM tableName
WHERE date2 < '2014-01-01' AND NOT (refid IS NULL)
修改强>
如下面的评论中所述,我可能误解了问题的以下部分,意味着需要删除条目。
使用refid删除所有行,其中date2小于2014-01-01
在这种情况下,以下内容将返回指定日期之后的所有结果:
SELECT *
FROM tableName
WHERE date2 > '2014-01-01' AND NOT (refid IS NULL)
我还假设“with refid”意味着应该填充refid
。
要获得原始问题中描述的结果,我会将查询简化如下,因为特定的日期部分不会给出结果:
SELECT *
FROM tableName
WHERE (refid = 11) OR (refid = 16)
另一个编辑
以下内容应返回分配给refid
的所有条目,其中date2
之后的2014-01-01
条目为SELECT DISTINCT t1.*
FROM tableName t1
INNER JOIN tableName t2 ON t1.refid = t2.refid AND t2.date2 > '2014-01-01'
SELECT *
FROM tableName t1
WHERE EXISTS(
SELECT *
FROM tableName t2
WHERE t1.refid = t2.refid AND t2.date2 > '2014-01-01'
)
或者你可以使用exists:
refid
或链接到符合个人资料的SELECT *
FROM tableName t1
INNER JOIN (
SELECT DISTINCT refid
FROM tableName
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
的单独表格
{{1}}
答案 1 :(得分:3)
如果我理解你的问题,这可能会做你想要的:
SELECT *
FROM datatable
WHERE refid IN (SELECT DISTINCT refid
FROM datatable
WHERE date2 > '20140101')
子查询返回所有不同的 refid 值,其中date2的存在大于2014-01-01。您可以使用这些 refid 的列表来返回包含 refid 的所有行。
修改强>
添加 SQL Fiddle 进行试验。 (此外,SQL Fiddle是一个非常有用的工具,可以帮助您更清楚地制定数据库问题,并使它们更有可能以有用的方式得到解答!)
答案 2 :(得分:2)
要获得问题中描述的结果,可以使用以下方法。
SELECT
*
FROM
datatable
WHERE
refid = 11
OR refid = 16
如果您查看所需的结果:
id refid date1 date2 nextdate
10 11 2007-02-15 2008-02-15 002/2007
11 11 2008-02-21 2009-02-21 001/2008
12 11 2009-02-09 2010-02-09 001/2009
13 11 2010-02-09 2011-02-09 002/2010
14 11 2011-07-19 2012-07-19 054/2011
15 11 2012-07-17 2014-07-17 066/2012
25 16 2007-02-15 2008-02-15 004/2007
27 16 2009-02-10 2010-02-10 004/2009
28 16 2010-02-12 2011-02-12 005/2010
29 16 2011-07-26 2012-07-26 055/2011
30 16 2012-07-18 2014-07-18 067/2012
您会注意到date2
字段不符合您在问题中定义的条件:
我有这个数据表。我需要通过以下过滤数据表 条件:删除
refid
小于date2
的所有行 2014年1月1日
date2字段介于2008-02-15和2014-07-18之间。您在标准中说明的唯一其他参考是“with refid
”。查看您的表格和所需的结果,您会注意到您想要选择的项目的refid
是11或16,因此问题中指定的过滤日期会更加分散注意力。试图帮助。您应该考虑澄清您的问题,以防止进一步的混淆,并可能创建一个sql小提琴(goto:http://sqlfiddle.com/),以便人们能够将他们的结果与您所需的结果进行比较,而不是告诉人们重新阅读您的问题。
修改强>
以下内容应返回所有dataTable结果,其中有一个或多个dataTable条目具有相同的refid
和date2 > '2014-01-01'
SELECT *
FROM datatable t1
INNER JOIN (
SELECT DISTINCT refid
FROM datatable
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
答案 3 :(得分:1)
试试这个
SELECT * FROM table WHERE date2 >='2014-01-01'