Sql 为始终满足指定标准的实体选择所有记录

Sql 为始终满足指定标准的实体选择所有记录,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我在SQL Server中有这样一个表: Name ID StartDate EndDate -------------------------------- James 232 2005 2015 James 232 2001 2006 Joe 600 1982 2005 Lord 608 2003 2005 Lord 608 2006 2012 Lord 608

我在SQL Server中有这样一个表:

Name    ID  StartDate   EndDate
--------------------------------
James   232   2005       2015
James   232   2001       2006
Joe     600   1982       2005
Lord    608   2003       2005
Lord    608   2006       2012
Lord    608   1999       2004
Lee     122   2001       2003
Lee     122   2002       2006
我需要编写一个查询,如果所有记录都满足以下条件,则该查询只包含名称/ID的记录: StartDate不在2005年之后,EndDate不能在2005年之前

因此,查询结果应如下所示:

Name    ID  StartDate   EndDate
-------------------------------
James   232    2005       2015
James   232    2001       2006
Joe     600    1982       2005
下面是我的查询,它错误地返回了Lord和Lee的三条记录:

SELECT * 
FROM #FortuneCompany fc
WHERE EXISTS (
              SELECT 1 
              FROM #FortuneCompany fc1 
              WHERE fc1.ID = fc.ID 
                AND YEAR(fc1.StartDate)<=2005 
                AND YEAR(fc1.EndDate)>=2005
              )  
WHERE子句

WHERE子句

不需要子查询。我假设StartDate和EndDate列是int。只有当它们是date时,才需要使用YEAR函数。在您的问题中,您所说的三个结果的顶部和底部行不应返回,但实际上符合标准


不需要子查询。我假设StartDate和EndDate列是int。只有当它们是date时,才需要使用YEAR函数。在您的问题中,您所说的三个结果的顶部和底部行实际上不应返回,它们确实符合标准。

如果理解正确,您根本不想为用户选择行,如果该用户至少有一个错误条目。要实现此目标,您可以在以下情况下使用NOT:

质疑

输出


如果理解正确,则如果该用户至少有一个错误条目,则根本不希望为该用户选择行。要实现此目标,您可以在以下情况下使用NOT:

质疑

输出



您的查询在哪里?到目前为止您尝试了什么SQL?其中startdate=2005。为什么不包括joe`joe 600 1982 2005`1982小于2005,2006大于2005,因此,它应该包括从存在的《财富》公司中选择*从存在的《财富》公司中选择1从fc1.ID=fc.ID和YEARfc1.StartDate=2005这是我的查询您的查询在哪里?到目前为止您尝试了什么SQL?其中StartDate=2005。为什么不包括joe`joe 600 1982 2005`1982年小于2005年,2006年大于2005年,因此应包括从存在的《财富》公司中选择*从fc1.ID=fc.ID和YEARfc1.StartDate=2005的《财富》公司fc1中选择1。这是我的问题。我猜OP希望其中StartDate='2005-01-01'包括所有年份。只是猜测…哎呀,我错过了与2005年相等或更大的比赛。我已经更正了。我想OP希望StartDate='2005-01-01'包含所有年份。只是猜测…哎呀,我错过了与2005年相等或更大的比赛。我已经纠正了。我不想结果是谁都满足了这个条件,我有一个结果,他只填写了这个条件,包括名字lee和lord,但我不想要这些名字,因为lee的起始日期是2001年和2003年,这是我的条件,结束日期等于或大于2005年,没有填写,然后名字lord,这将是正确的答案。如果它对你有效-@Arasu-请标记为答案。我不希望结果完全符合这个条件,我有一个结果,他只填写了这个条件,包括名字lee和lord,但我不想要这些名字,因为lee的起始日期是2001年和2003年,这是我的条件,结束日期等于或大于2005年,没有填写,然后名字lord,这将是正确的答案。如果它对你有用-@Arasu-请标记为答案。此查询没有给出正确答案请阅读我的问题clearly@Arasu-好吧,看,这就是问题所在。你的问题不清楚。你为什么不先处理这个问题呢。它应该是>=而不是=>这个查询没有给出正确的答案请阅读我的问题clearly@Arasu-好吧,看,这就是问题所在。你的问题不清楚。为什么不先处理一下呢。它应该是>=而不是=>
SELECT Name, ID, StartDate, EndDate
FROM MyTable
WHERE StartDate <= '2005-01-01' AND Enddate >= '2005-01-01'
SELECT Name, ID, StartDate, EndDate
FROM Table
WHERE StartDate <= 2005 
AND Enddate >= 2005
SELECT Name, ID, StartDate, EndDate
FROM #FortuneCompany fc
WHERE Name NOT IN(
        SELECT Name
        FROM #FortuneCompany fc
        WHERE StartDate > 2005 
        OR Enddate < 2005)
CREATE TABLE #FortuneCompany
(
   Name NVARCHAR(40),
   ID INT,
   StartDate INT,
   EndDate INT
)
INSERT INTO #FortuneCompany VALUES
('James',232, 2005, 2015),
('James',232, 2001, 2006),
('Joe'  ,600, 1982, 2005),
('Lord' ,608, 2003, 2005),
('Lord' ,608, 2006, 2012),
('Lord' ,608, 1999, 2004),
('Lee'  ,122, 2001, 2003),
('Lee'  ,122, 2002, 2006)
Name    ID  StartDate   EndDate
James   232 2005        2015
James   232 2001        2006
Joe     600 1982        2005