使用查询过滤数据

时间:2013-11-27 11:16:06

标签: sql sql-server-2008 filtering

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

4 个答案:

答案 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条目具有相同的refiddate2 > '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'