1

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

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

HusbandIdWifeId是来自另一个表的外键,称为存储 Person每个人的附加信息的地方。

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

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

4

4 回答 4

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
于 2012-12-22T18:59:03.033 回答
2

这是一种方法:

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

于 2012-12-22T19:03:08.997 回答
0

在表上做一个自我加入:

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;

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

于 2012-12-22T19:47:42.903 回答
-1

从 enddate > GETDATE() 或 enddate 为 null 的情侣中选择 count(wifeid),wifeid

于 2012-12-22T19:10:33.737 回答