2017-05-18 14 views
0

私は2つのテーブルTABLE1(レコードのリスト)& TABLE2(マイナンバーをチェックする範囲)範囲タイプを考慮したオーバーラップ番号範囲の特定方法

TABLE2考慮型IDで重複範囲/行(複数可)を識別するための方法がありますか?

目的更に

RECORDS TABLE +-----------------+-----------------+-------------------+ + typeId + tbl1_NumberFrom + tbl1_NumberTo + +-----------------+-----------------+-------------------+ + 1 + 1 + 5 + + 1 + 8 + 10 + + 1 + 15 + 20 + + 2 + 4 + 7 + + 2 + 9 + 10 + + 2 + 11 + 20 + +-----------------+-----------------+-------------------+ MY RANGES TABLE TO CHECK +-----------------+-----------------+-------------------+ + typeId + My_NumberFrom + My_NumberTo + +-----------------+-----------------+-------------------+ + 1 + 1 + 3 + + 1 + 6 + 8 + + 1 + 11 + 12 + + 2 + 1 + 3 + + 2 + 6 + 8 + + 2 + 10 + 10 + +-----------------+-----------------+-------------------+ REQUIRED RESULT AS FOLLOW: +-----------------+-----------------+-------------------+-------------------+ + typeId + My_NumberFrom + My_NumberTo + IsOverlapping + +-----------------+-----------------+-------------------+-------------------+ + 1 + 1 + 3 + YES + + 2 + 1 + 3 + NO + + 1 + 6 + 8 + YES + + 2 + 6 + 8 + YES + + 1 + 11 + 12 + NO + + 2 + 10 + 10 + YES + +-----------------+-----------------+-------------------+-------------------+ 

、上記表
親切

IF OBJECT_ID('tempdb.dbo.#dbtable', 'U') IS NOT NULL DROP TABLE #dbtable; 
SELECT * INTO #dbtable FROM 
    (SELECT 1 typeId, 1 AS tbl1_NumberFrom, 5 AS tbl1_NumberTo 
    UNION ALL 
    SELECT 1 typeId, 8 AS tbl1_NumberFrom, 10 AS tbl1_NumberTo 
    UNION ALL 
    SELECT 1 typeId, 15 AS tbl1_NumberFrom, 20 AS tbl1_NumberTo 
    UNION ALL 
    SELECT 2 typeId, 4 AS tbl1_NumberFrom, 7 AS tbl1_NumberTo 
    UNION ALL 
    SELECT 2 typeId, 9 AS tbl1_NumberFrom, 10 AS tbl1_NumberTo 
    UNION ALL 
    SELECT 2 typeId, 11 AS tbl1_NumberFrom, 20 AS tbl1_NumberTo) 
AS dbTable 

IF OBJECT_ID('tempdb.dbo.#MyRanges', 'U') IS NOT NULL DROP TABLE #MyRanges; 
SELECT * INTO #MyRanges FROM 
    (SELECT 1 typeId, 1 AS myr_NumberFrom, 3 AS myr_NumberTo 
    UNION ALL 
    SELECT 1 typeId, 6 AS myr_NumberFrom, 8 AS myr_NumberTo 
    UNION ALL 
    SELECT 1 typeId, 11 AS myr_NumberFrom, 12 AS myr_NumberTo 
    UNION ALL 
    SELECT 2 typeId, 1 AS My_NumberFrom, 3 AS myr_NumberTo 
    UNION ALL 
    SELECT 2 typeId, 6 AS myr_NumberFrom, 8 AS myr_NumberTo 
    UNION ALL 
    SELECT 2 typeId, 10 AS myr_NumberFrom, 10 AS myr_NumberTo) 
AS MyList 


SELECT * FROM #dbtable t 
SELECT * FROM #MyRanges m 

示唆ため

SQL、

多くのありがとうございます!他方は第一の端部の前に開始しながら、二つの範囲が重なっているかどうかを確認する

+0

最後の行(2-10-10)をYESにしないでください。それは2-9-10と重なっている。 –

+0

@ネマヤ・ペロビッチオハイオ州はいはいです。 – Haseeb

答えて

1
SELECT DISTINCT m.*, 
CASE ISNULL(t.typeId,0) WHEN 0 THEN 'NO' ELSE 'YES' END AS IsOverlapping 
FROM #MyRanges m 
LEFT OUTER JOIN #dbtable t 
ON t.typeId = m.typeId 
AND 
(t.tbl1_NumberFrom BETWEEN m.myr_NumberFrom AND m.myr_NumberTo 
OR 
t.tbl1_NumberTo BETWEEN m.myr_NumberFrom AND m.myr_NumberTo) 
+0

はうまくいく... !! – Haseeb

1

方法は、一方が他方の端部の前に開始するかどうかをテストすることです。ここ
は、T-SQLでそれを行うための一つの方法である:

SELECT typeId, 
     myr_NumberFrom, 
     myr_NumberTo, 
     CASE WHEN EXISTS 
     (
      SELECT 1 
      FROM #dbtable t 
      WHERE t.typeId = m.typeId 
      AND tbl1_NumberFrom <= myr_NumberTo 
      AND tbl1_NumberTo >= myr_NumberFrom 
     ) THEN 'Yes' 
     ELSE 'No' 
     END As IsOverlapping 
FROM #MyRanges m 

結果:

typeId myr_NumberFrom myr_NumberTo IsOverlap 
1  1    3    Yes 
1  6    8    Yes 
1  11    12    No 
2  1    3    No 
2  6    8    Yes 
2  10    10    Yes 

左に変更はサブクエリの代わりに参加する:

SELECT m.typeId, 
     myr_NumberFrom, 
     myr_NumberTo, 
     CASE WHEN t.typeId IS NOT NULL THEN 
      'Yes' 
     ELSE 
      'No' 
     END As IsOverlapping 
FROM #MyRanges m 
LEFT JOIN #dbtable t ON m.typeId = t.typeId 
        AND myr_NumberFrom <= tbl1_NumberTo 
        AND myr_NumberTo >= tbl1_NumberFrom 

結果があります同じ、ライブデモが更新されました。

You can see a live demo on rextester.

+0

は遅くありませんか?ケースで選択を使用している間? – Haseeb

+0

サブクエリが遅くなり、結合される可能性があります。 ... –

+0

ここでは、左の結合もあります。 –

1

私の答えは、ほとんどあなたの他の質問に答えと同じです。

オーバーラップには4種類あります。オーバーラップを見つけるには2つの条件が必要です。他の答えは、タイプが重複していることを忘れています。ここで、myr_numberfromは<、tbl1.numberfrom、myr_numberto> tbl1_numbertoです。

Select distinct m.typeId, m.Myr_NumberFrom,m.Myr_NumberTo, 
     case when t.tbl1_NumberFrom is null then 'No' else 'yes' end isOverlapping 
from #MyRanges m 
left join #dbtable t on m.typeId = t.typeId 
       and (m.Myr_NumberFrom between t.tbl1_NumberFrom and t.tbl1_NumberTo 
       or t.tbl1_NumberFrom between m.Myr_NumberFrom and m.Myr_Numberto)