Sql 使用查询筛选数据
我有这个数据表。我需要执行以下操作的查询: 如果存在大于2014-01-01的date2值,则返回refid的所有行。如果存在id,则我需要所有id 结果应该是这样的:Sql 使用查询筛选数据,sql,sql-server-2008,filtering,Sql,Sql Server 2008,Filtering,我有这个数据表。我需要执行以下操作的查询: 如果存在大于2014-01-01的date2值,则返回refid的所有行。如果存在id,则我需要所有id 结果应该是这样的: 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
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
这是非常基本的,但如果我理解正确:
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
SELECT *
FROM datatable t1
INNER JOIN (
SELECT DISTINCT refid
FROM datatable
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
我还假设with refid意味着应该填充refid
然而,为了获得原始问题中描述的结果,我将简化查询,如下所示,因为指定的日期部分不会给出结果:
SELECT *
FROM tableName
WHERE date2 > '2014-01-01' AND NOT (refid IS NULL)
另一次编辑
以下内容应返回分配给refid的所有条目以及日期在2014-01-01之后的任何条目
或者,您可以使用exists:
SELECT DISTINCT t1.*
FROM tableName t1
INNER JOIN tableName t2 ON t1.refid = t2.refid AND t2.date2 > '2014-01-01'
或者链接到一个单独的符合配置文件的refid表
SELECT *
FROM tableName t1
WHERE EXISTS(
SELECT *
FROM tableName t2
WHERE t1.refid = t2.refid AND t2.date2 > '2014-01-01'
)
这是非常基本的,但如果我理解正确:
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
SELECT *
FROM datatable t1
INNER JOIN (
SELECT DISTINCT refid
FROM datatable
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
我还假设with refid意味着应该填充refid
然而,为了获得原始问题中描述的结果,我将简化查询,如下所示,因为指定的日期部分不会给出结果:
SELECT *
FROM tableName
WHERE date2 > '2014-01-01' AND NOT (refid IS NULL)
另一次编辑
以下内容应返回分配给refid的所有条目以及日期在2014-01-01之后的任何条目
或者,您可以使用exists:
SELECT DISTINCT t1.*
FROM tableName t1
INNER JOIN tableName t2 ON t1.refid = t2.refid AND t2.date2 > '2014-01-01'
或者链接到一个单独的符合配置文件的refid表
SELECT *
FROM tableName t1
WHERE EXISTS(
SELECT *
FROM tableName t2
WHERE t1.refid = t2.refid AND t2.date2 > '2014-01-01'
)
试试这个
SELECT *
FROM tableName t1
INNER JOIN (
SELECT DISTINCT refid
FROM tableName
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
试试这个
SELECT *
FROM tableName t1
INNER JOIN (
SELECT DISTINCT refid
FROM tableName
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
要获得问题中描述的结果,请执行以下操作
SELECT * FROM table WHERE date2 >='2014-01-01'
如果您查看所需的结果:
SELECT
*
FROM
datatable
WHERE
refid = 11
OR refid = 16
您会注意到date2字段不符合您在问题中定义的标准:
我有这个数据表。我需要通过以下方式过滤数据表
条件:删除日期2小于的具有refid的所有行
2014-01-01
日期2字段的范围介于2008-02-15和2014-07-18之间。您在标准中声明的唯一其他参考是refid。查看您的表格和所需的结果,您会注意到您想要选择的项目的refid为11或16,因此问题中指定的筛选日期对那些试图提供帮助的人来说更容易分心。你应该考虑清楚你的问题,以避免进一步的混乱,也许创建一个SQL小提琴Goto:这样人们就有能力把他们的结果与你需要的结果进行比较,而不是告诉人们重新阅读你的问题。
编辑:
如果有一个或多个数据表条目具有相同的refid和date2>“2014-01-01”,则以下内容应返回所有数据表结果
要获得问题中描述的结果,请执行以下操作
SELECT * FROM table WHERE date2 >='2014-01-01'
如果您查看所需的结果:
SELECT
*
FROM
datatable
WHERE
refid = 11
OR refid = 16
您会注意到date2字段不符合您在问题中定义的标准:
我有这个数据表。我需要通过以下方式过滤数据表
条件:删除日期2小于的具有refid的所有行
2014-01-01
日期2字段的范围介于2008-02-15和2014-07-18之间。您在标准中声明的唯一其他参考是refid。查看您的表格和所需的结果,您会注意到您想要选择的项目的refid为11或16,因此问题中指定的筛选日期对那些试图提供帮助的人来说更容易分心。你应该考虑清楚你的问题,以避免进一步的混乱,也许创建一个SQL小提琴Goto:这样人们就有能力把他们的结果与你需要的结果进行比较,而不是告诉人们重新阅读你的问题。
编辑:
如果有一个或多个数据表条目具有相同的refid和date2>“2014-01-01”,则以下内容应返回所有数据表结果
如果我正确理解您的问题,这可能会满足您的要求:
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
SELECT *
FROM datatable t1
INNER JOIN (
SELECT DISTINCT refid
FROM datatable
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
子查询将返回date2大于2014-01-01的所有不同的refid值。您可以使用这些refid的列表返回包含这些refid的所有行
编辑
添加一个用于实验的。此外,它是一个非常有用的工具,可以帮助您更清楚地表述数据库问题,并使它们更有可能以有用的方式得到回答 如果我正确理解您的问题,这可能会满足您的要求:
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
SELECT *
FROM datatable t1
INNER JOIN (
SELECT DISTINCT refid
FROM datatable
WHERE date2 > '2014-01-01'
)t2 ON t1.refid = t2.refid
子查询将返回date2大于2014-01-01的所有不同的refid值。您可以使用这些refid的列表返回包含这些refid的所有行
编辑
添加一个用于实验的。此外,它是一个非常有用的工具,可以帮助您更清楚地表述数据库问题,并使它们更有可能以有用的方式得到回答 问题不在于如何过滤结果,而在于如何删除行。在这种情况下,只需将DELETE更改为select我需要在查询时返回值,而不是删除它们。所有这些查询都不正常,因为我没有得到想要的结果!看看我给你的两条SELECT语句,它们只会首先返回那些entri
2014-01-01之后的结果,以及您问题中第二个网格中定义的结果。如果这些都不是你所追求的,也许可以考虑重新编写你的问题来阐明你需要什么。看起来你首先接受了别人的答案,但是你会看到我的回答中的三种方法,现在所有这些方法都应该以不同程度的效率来工作。问题不是如何过滤结果,而不是删除行。在这种情况下,只需将DELETE更改为select我需要在查询时返回值,而不是删除它们。所有这些查询都不正常,因为我没有得到想要的结果!看看我给你的两个SELECT语句,它们只会首先返回2014-01-01之后的条目,然后返回你问题中第二个网格中定义的结果。如果这两个都不是你想要的,也许考虑重新写你的问题来澄清你需要什么。看起来你首先接受了别人的回答,但是你会在我的回答中看到三种方法,所有这些方法都应该以不同程度的效率工作。当然,对上帝来说,这已经在其他地方得到了回答……你的问题还不够清楚,所以难怪你没有得到你显然想要的结果。您的意思可能是返回refid的所有行,其中存在大于2014-01-01的date2值?我将更改该值…:当然,上帝已经在其他地方回答了这个问题……你的问题还不够清楚,所以难怪你没有得到你显然想要的结果。您的意思可能是返回refid的所有行,其中存在大于2014-01-01的date2值?我将更改该值…:他们在您的预期输出中没有任何日期2小于2014-01-01的记录是的。仔细查看日期2。在您的预期输出中,没有任何日期2小于2014-01-01的记录是的。仔细查看date 2。我需要常规查询,因为这只是sql表的一部分。表很大,并且有很多idsI已经改变了问题,所以现在它的形式可能更好:现在检查:我需要常规查询,因为这只是我的sql表的一部分。表很大,并且有很多idsI已经改变了问题,所以现在它的表述可能更好:现在检查:我认为这是正确的解决方案。我会检查我的数据库。我认为这是正确的解决方案。我会检查我的数据库。Tnx。