2017-01-12 124 views
0

我在SQL Server 2014的兩個表:避免笛卡爾乘積檢查對

  1. 表A包含三列:第一組,PROC和日期
  2. 表B包含四列:過程Proc1,PROC2,開始,結束

表B是如果組中的最小日期在Start和End之間,則不應出現在表A的同一組中的Procs對的列表。我試圖找到表A中違反此規則的組,但問題是表A有60M組,每組最多有100行,表B有65000對。

其他DEETS:

  • 結束可以是NULL
  • 過程Proc1和PROC2總是長度5個字符,但PROC可以是任意長度

我的策略是

  1. 對於A中的每個組,獲取最小日期和東西Proc的所有唯一值,用逗號分隔(該字段從不包含逗號)到Procs的新字段。用組MinDate Procs產生表C。 (i)開始和結束之間的MinDate(或>開始和結束爲NULL)和(ii)如果我替換Proc1和Proc2的實例,則Procs的長度減少10在它內部是空字符串。

該過程適用於(在數據的子集上),但我正在尋找如何將其擴展到完整數據集的建議。

請讓我知道,如果你想任何其他細節。謝謝!

+6

請** [編輯] **您的問題,並添加一些樣本數據和基於該數據的預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

1

如果我理解正確,可以通過連接完成此操作。如果您在b中有每行的唯一標識符,這將有所幫助。

的方法是加入表一起,再算上違規的每一行的數量b

select a.group, b.id, count(distinct a.proc) as num_procs 
from a join 
    b 
    on a.proc in (b.proc1, b.proc2) and 
     a.date between b1.start and coalesce(b1.end, getdate()) 
group by a.group, b.id 
having count(distinct a.proc) = 2; 

如果沒有b.id,則可以使用四列,以確定每行。

您的具體數據問題的長度爲proc是一個單獨的問題。您應該修正數據,以便兩個表之間應該匹配的字段實際上具有相同的類型。