【问题标题】:Filter data with query使用查询过滤数据
【发布时间】:2013-12-13 00:09:35
【问题描述】:
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

我有这个数据表。我需要执行以下操作的查询: 返回存在大于 2014-01-01 的 date2 值的 refid 的所有行(如果有 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

【问题讨论】:

  • 天哪,这已经在其他地方得到了回答......
  • 您的问题不够清楚,所以难怪您没有得到明显想要的结果。您的意思可能类似于“返回 存在 date2 值大于 2014-01-01 的 refid 的所有行”?
  • 我会改变它... :)

标签: sql sql-server-2008 filtering


【解决方案1】:

这是非常基本的,但如果我理解正确的话:

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 的所有条目以及2014-01-01 之后带有date2 的任何条目

SELECT DISTINCT t1.*
FROM tableName t1
INNER JOIN tableName t2 ON t1.refid = t2.refid AND t2.date2 > '2014-01-01'

你也可以使用exists:

SELECT *
FROM tableName t1
WHERE EXISTS(
    SELECT * 
    FROM tableName t2
     WHERE t1.refid = t2.refid AND t2.date2 > '2014-01-01'
)

或链接到适合个人资料的 refid 的单独表格

SELECT *
FROM tableName t1
INNER JOIN (
    SELECT DISTINCT refid 
    FROM tableName 
    WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid

【讨论】:

  • 不是如何过滤结果的问题,而不是删除行。在这种情况下,只需将 DELETE 更改为 SELECT
  • 我需要通过查询返回值,而不是删除它们。
  • 所有查询都不行,因为我没有得到想要的结果!
  • 看看添加的内容,我给了你两个SELECT 语句,它们首先会返回2014-01-01 之后的那些条目,其次是在你的问题的第二个网格中定义的那些结果。如果这些都不是你所追求的,也许考虑重写你的问题以澄清你需要什么。
  • 看起来您首先接受了别人的回答,但您现在会在我的回复中看到三种方法,所有这些方法都应该具有不同程度的效率。
【解决方案2】:

试试这个

SELECT * FROM table WHERE date2 >='2014-01-01'

【讨论】:

  • 他们在您的预期输出中没有任何date2 小于2014-01-01 的记录
  • 是的。仔细看日期2。
【解决方案3】:

要获得问题中描述的结果,请执行以下操作。

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-01-01

date2 字段的范围在 2008-02-15 和 2014-07-18 之间。您在标准中声明的唯一其他参考是“refid”。查看您的表格和所需的结果,您会注意到您想要选择的项目的 refid 是 11 或 16,因此问题中指定的过滤日期被证明更容易分散那些试图帮助。您应该考虑澄清您的问题以防止进一步混淆,并可能创建一个 sql fiddle(转到:http://sqlfiddle.com/),以便人们能够将他们的结果与您所需的结果进行比较,而不是告诉人们重新阅读您的问题。

编辑:

如果有一个或多个具有相同refiddate2 &gt; '2014-01-01' 的dataTable 条目,则以下应返回所有dataTable 结果

SELECT *
FROM datatable t1
INNER JOIN (
    SELECT DISTINCT refid 
    FROM datatable 
    WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid

【讨论】:

  • 我需要一般查询,因为这只是我的 sql 表的一部分。表很大,id很多
  • 我已经改变了问题,所以也许现在它的表述更好:) 现在检查:)
【解决方案4】:

如果我正确理解您的问题,这可能会满足您的要求:

SELECT   *
FROM     datatable
WHERE    refid IN (SELECT  DISTINCT refid 
                   FROM    datatable
                   WHERE   date2 > '20140101')

子查询返回所有存在 date2 且大于 2014-01-01 的不同 refid 值。您可以使用这些 refid 的列表返回所有带有这些 refid 的行。

编辑
添加一个 SQL Fiddle 进行试验。 (另外,SQL Fiddle 是一个非常有用的工具,可以帮助您更清晰地制定数据库问题并让它们更有可能以有用的方式得到回答!)

【讨论】:

  • 我认为这是正确的解决方案。我会检查我的数据库。 Tnx。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2014-08-15
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多