【问题标题】:SQL query to find multiple wivesSQL查询查找多个妻子
【发布时间】:2012-12-22 18:45:34
【问题描述】:

我有一个数据库,其中包含一个名为“Couple”的表,它表示数据对。

此表包含以下字段:CoupleId, WifeId, HusbandId, startDate, Enddate 其中startdate代表结婚开始日期,enddate代表结婚结束日期。

HusbandIdWifeId 是来自另一个名为 Person 的表的外键,其中存储了每个人的附加信息。

我需要一个查询,返回同时与两个或更多男人结婚的女人的信息(同步妻子)。

例如,#1 的女性与#2 的男性结婚,表格为 1-1-2012 至 1-5-2012 (dd-mm-yyyy),而该女性(#1)与#2 的男性结婚3 从 1-3-2012 到 1-4-2012 ,这被称为女性#1的同步婚姻

【问题讨论】:

  • 请解释一下您有什么疑问already tried?你到底卡在哪里了?
  • 听起来像家庭作业 :-) 向我们展示你的尝试!
  • 男人!如果只有同步的妻子......
  • 是的,这是作业 :) 我有一个查询返回已婚不止一次的女性的信息,但我无法确定谁有同步婚姻(我的意思是与两个男人结婚或更多同时)
  • @Daniel 你想和另一个男人分享你的妻子???

标签: sql sql-server-2012


【解决方案1】:

这是一种方法:

SELECT
   DISTINCT A.WifeID
FROM
   dbo.Couple A
   INNER JOIN dbo.Couple B
      ON A.WifeID = B.WifeID
      AND A.HusbandID <> B.HusbandID -- or A.CoupleID > B.CoupleID
      AND A.StartDate < B.EndDate
      AND A.EndDate > B.StartDate;

要通过 FromDate 和 ToDate 范围实际计算每个人有多少并发关系,是一个更复杂的查询。

【讨论】:

  • 感谢您的重播,我还有一个问题,在我的问题中有一个条件是男性允许同时与最多 4 个女性结婚,如何确定是否有男性与 5 个或更多结婚同时
  • 请提出一个新问题。链接我这里。但是,只有您自己尝试并展示您的尝试时,我才会提供帮助。
  • 你加入丈夫 id 只是为了从自我加入中删除重复,对吧?
  • 是的@sorencito 否则每个丈夫都会成为他自己的戴绿帽子。
  • 可能这不是一个有趣的场景,但是你删除了那些被妻子第二次背叛的丈夫。我会坚持我的解决方案并计算wifeids,但将结果除以2。然后你一次就有关系的数量。这也是作业第二部分的解决方案,不是吗?
【解决方案2】:

与其使用自联接,不如使用相关子查询。它更易于阅读和理解,因为它使读者无需考虑自联接中的重复项。

SELECT COUNT(A.CoupleId) "no of conflicting relationships", A.WifeId
FROM
  COUPLE A
WHERE EXISTS ( 
    SELECT AA.WifeId
    FROM COUPLE AA
    WHERE 
    A.WifeId = AA.WifeId AND -- same wife, but ...
    A.CoupleId <> AA.CoupleId AND -- another couple (independent of husband)
    A.StartDate < AA.EndDate AND
    A.EndDate > AA.StartDate
)
Group By A.WifeId
Having COUNT(A.CoupleId) > 1 -- optional for the given scenario, as the result will only contain records > 1

【讨论】:

  • 您需要考虑日期。
  • 不,它没有。所有要求都在第一篇文章中提供--“同时”。
  • 哦,是的,你是对的。没有仔细阅读并依赖另一个现在不再存在的错误答案。过失。
  • 修改后的答案和重新表述的查询,完全删除了旧查询,因为它完全是错误的。
  • 如果有 7 个并发配偶,然后是 6 个,然后又是 7 个呢?你将如何展示它? Here's my query that can answer exactly 任何你想要的细节。只需稍作修改(实际上更简单),它就可以显示每次配偶改变时的计数,而不是一致的并发配偶数(参见 HusbandID 35,按原样显示 3 行,但有 6 种不同的关系)。
【解决方案3】:

在表上进行自联接:

SELECT DISTINCT c1.WifeID
FROM Couple c1
   INNER JOIN Couple c2 ON c1.WifeID = c2.WifeID
   AND c1.HusbandID <> c2.HusbandID
   AND c1.StartDate < c2.EndDate
   AND c2.StartDate < c1.EndDate;

但是对于大数据,执行时间会更长……

【讨论】:

    【解决方案4】:

    选择计数(wifeid),wifeid 从夫妇 其中 enddate > GETDATE() 或 enddate 为空

    【讨论】:

    • 不正确... getdate() 不需要。您的聚合需要一个 group by 子句...
    • 我确实在 SQL 2005 中运行了这段代码,它运行良好,我接受不需要获取日期。
    • 首先,考虑一下。何时将聚合放在聚合之外的选择列表中包含的列上有意义? 几乎从来没有之类的东西。其次,我怀疑它甚至会运行的查询甚至不会产生正确的答案。
    • ErikE 是对的,你的声明甚至没有运行。即使添加所需的 group by 子句,也不会产生所需的结果。
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 2010-10-08
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多