【问题标题】:Select all records for entities that always fulfil a specified criterion选择始终满足指定条件的实体的所有记录
【发布时间】:2015-11-05 12:43:53
【问题描述】:

我在 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
              )  

【问题讨论】:

  • 您的查询在哪里?
  • 到目前为止你尝试过什么 SQL?
  • where startdate &lt;= 2005 and enddate &gt;= 2005.
  • 为什么不应该包含 joe ` Joe 600 1982 2005` 1982 小于 2005 而 2006 大于 2005,所以应该包含
  • SELECT * FROM #FortuneCompany WHERE EXISTS (SELECT 1 FROM #FortuneCompany fc1 WHERE fc1.ID = fc.ID AND YEAR(fc1.StartDate)=2005 ) 这是我的查询

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

WHERE 子句?

SELECT Name, ID, StartDate, EndDate
FROM MyTable
WHERE StartDate <= '2005-01-01' AND Enddate >= '2005-01-01'

【讨论】:

  • 我猜 OP 希望 WHERE StartDate = '2005-01-01' 包括整年。 (只是猜测......)
  • 糟糕,我错过了“等于或大于 2005”。我已经更正了。
【解决方案2】:
SELECT Name, ID, StartDate, EndDate
FROM Table
WHERE StartDate <= 2005 
AND Enddate >= 2005

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

【讨论】:

  • 这个查询没有给出正确答案 清楚地阅读我的问题
  • @Arasu -- 好吧,这就是问题所在。您的问题不清楚。你为什么不先解决这个问题。
  • 应该是&gt;= 而不是=&gt;
【解决方案3】:

如果理解正确,如果该用户至少有 1 个错误条目,您根本不想为该用户选择行。为此,您可以使用NOT IN 如下:

查询

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

【讨论】:

  • 我不想要所有满足这个条件的结果,我只有满足这个条件的结果
  • 这包括名字 lee 和 lord,但我不想要这些名字,因为 lee 的 startdate 为 2001 和 2003,这是我的条件 enddate 等于或大于 2005 未满,然后名字 lord 也
  • 这将是正确的答案。如果它对您有用 - @Arasu - 请标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2021-12-17
  • 2023-03-28
  • 2019-07-30
  • 2023-03-25
  • 2020-12-10
  • 2021-12-26
相关资源
最近更新 更多