0

TABLE_A には、ID ごとに最小 SDT と最大 EDT があります。

例: ID=1000 の場合、これは 1/09/2013 と 3/10/2013 になります。

例: ID=1001 の場合、これは 1/07/2013 と 3/08/2013 になります。

期待される結果は、TABLE_B の SDT が TABLE_A の最小 SDT 値と最大 EDT 値の間にある、TABLE_B のすべてのレコードです。

フィドルの例

TABLE_A

ID      SDT          EDT
------------------------------
1000    1/10/2013    3/10/2013  
1000    1/09/2013    3/09/2013   
1001    1/08/2013    3/08/2013
1001    1/07/2013    3/07/2013
1002    1/06/2013    3/06/2013

TABLE_B

ID      SDT
-----------------
1000    2/10/2013   ===> because it falls between 1/09/2013 and 3/10/2013
1000    4/09/2013   ===> because it falls between 1/09/2013 and 3/10/2013
1001    2/08/2013   ===> because it falls between 1/07/2013  and 3/08/2013
1001    4/05/2013   ==> not in result because it's not between 1/07/2013 and 3/08/2013
1002    4/06/2013   ==> also out of range, so not in results
4

2 に答える 2

1

最小/最大値にグループ化を使用し、関連するサブクエリを関連付けることができますtable_b

Select
    *
From
    Table_b b
Where
    Exists (
        Select
            'x'
        From
            table_a a
        Where
            a.id = b.id
        group by
            a.id
        having
            min(a.sdt) <= b.sdt and
            max(a.edt) >= b.sdt
  )

Example Fiddle

于 2013-10-03T22:02:45.680 に答える
0

サブクエリで GROUP BY を使用すると、不要なパフォーマンス コストが発生することに注意してください。

SELECT b.*
FROM table_b b
WHERE EXISTS (
    SELECT 1
    FROM table_a a
    WHERE b.sdt BETWEEN LEAST(a.sdt, e.edt) AND GREATEST(a.edt, a.sdt)
      AND a.id = b.id
);

編集/修正:
このソリューションは、MIN/MAX グループ化ではなく、table_a の個々の行に対して照合する場合にのみ適用されます。以前、table_a の MIN/MAX グループ化要件を見落としていました。

以下は、GROUP BY なしで 2 つの EXISTS クエリを使用し、正しい結果を返します。

SELECT b.*
FROM table_b b
WHERE (EXISTS (
    SELECT 1
    FROM table_a a
    WHERE b.sdt >= a.sdt 
    AND a.id = b.id
) AND EXISTS (
    SELECT 1
    FROM table_a a
    WHERE b.sdt <= a.edt 
    AND a.id = b.id
));
于 2013-10-03T22:15:21.233 に答える