1

データカップルを表す「Couple」という名前のテーブルを含むデータベースがあります。

このテーブルには、次のフィールドが含まれています。CoupleId, WifeId, HusbandId, startDate, Enddate ここでstartdate、は結婚が開始enddateする日付を表し、は結婚が終了する日付を表します。

HusbandIdおよびは、各人の追加情報が格納されている場所WifeIdと呼ばれる別のテーブルの外部キーです 。Person

同時に2人以上の男性と結婚している女性(同期妻)の情報を返すクエリが必要です。

たとえば、#1の女性は#2のフォーム1-1-2012から1-5-2012(dd-mm-yyyy)の男性と結婚し、この女性(#1の)は#3の男性と結婚しました。 -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

これはそれを行う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の範囲で、各人にいくつの同時関係があるかを実際に把握することは、はるかに複雑なクエリです。

于 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 に答える