SQL查询以查找多个妻子

SQL查询以查找多个妻子,sql,sql-server-2012,Sql,Sql Server 2012,我有一个数据库,其中包含一个名为Couple的表,它表示数据对 此表包含以下字段:CoupleId、WifeId、HusbandId、startDate、Enddate 其中startdate表示婚姻开始的日期,enddate表示婚姻结束的日期 HusbandId和WifeId是另一个名为Person的表中的外键,其中存储了每个人的附加信息 我需要一个查询,返回同时与两个或两个以上男人结婚的女性的信息 例如,从2012年1月1日到2012年5月1日,一名女性与一名男性结为夫妻,共2人,从2012

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

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

HusbandId和WifeId是另一个名为Person的表中的外键,其中存储了每个人的附加信息

我需要一个查询,返回同时与两个或两个以上男人结婚的女性的信息


例如,从2012年1月1日到2012年5月1日,一名女性与一名男性结为夫妻,共2人,从2012年1月3日到2012年1月4日,该女性与一名男性结为夫妻,共3人,这称为女性1的同步婚姻,而不是使用相关子查询而不是自联接。它更容易阅读和理解,因为它使读者不必考虑自联接中的重复项

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

这是一种方法:

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范围,是一个更复杂的查询。

选择countwifeid,wifeid 来自夫妇
当enddate>GETDATE或enddate为空时,对表执行自联接,如下所示:

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;


但对于海量数据,执行时间将更长…

请解释您有哪些查询?你到底被困在哪里了?听起来像是家庭作业:-让我们看看你尝试了什么!成年男子如果我有一个同步的妻子……是的,这是我的家庭作业:我有一个查询,返回已婚妇女不止一次的信息,但我不知道谁的婚姻是同步的,我是说同时和两个或两个以上的男人结婚time@Daniel你想和另一个男人分享你的妻子吗???你需要把日期考虑进去。不,没有。所有的要求都可以同时在第一篇文章中找到。哦,是的,你说得对。没有仔细阅读,依赖另一个错误的答案,现在已经不存在了。我犯了错。修改后的答案和重新制定的问题,完全放弃了旧的问题,因为它显然是错误的。如果有7个配偶同时出现,然后是6个,然后又是7个呢?你将如何展示它?任何你想要的细节。只需稍加修改,实际上更简单,它可以显示配偶每次变化时的计数,而不是同时配偶的一致性(见HusbandID 35,按原样有3行,但有6种不同的关系)。不正确。。。不需要getdate。你的聚合需要一个GROUPBY子句…我在SQL 2005中运行了这段代码,它工作得很好,我接受get日期不是必需的。首先,考虑一下。什么时候将聚合放在聚合之外的选择列表中的列上有意义?几乎从来没有。第二,我怀疑这个查询是否会运行,它甚至不会产生一个正确的答案。即使在添加所需的group by子句时,也不会产生期望的结果。感谢您的重播,我还有另一个问题,在我的问题中,有一个条件是男性允许同时与最多4名女性结婚,如何确定是否有任何男性同时与5名或更多女性结婚请提出一个新问题。在这里链接我。但我只会帮助你自己尝试并展示你所尝试的。你加入丈夫身份证只是为了从自我加入中重复移除,对吗?是的@sorencito否则每个丈夫都会是自己的绿帽子。也许这不是一个有趣的场景,但你移除那些被妻子第二次背叛的丈夫。我会坚持我的解决方案,数一数wifeids,但将结果除以2。那么你一次就有了那么多的关系。这也是家庭作业第二部分的解决方案,不是吗?