2017-11-04 48 views
1

我有兩個SQL臨時表#Temp1#Temp2從多組記錄中查找entryno集合

我想得到entryno其中包含一套臨時表二。

例如:#Temp2有8條記錄。我想搜索#Temp1,其中包含一組來自#Temp1的記錄。

CREATE TABLE #Temp1 (entryNo INT, setid INT, measurid INT,measurvalueid int) 

CREATE TABLE #Temp2(setid INT, measurid INT,measurvalueid int) 

INSERT INTO #Temp1 (entryNo,setid,measurid,measurvalueid) 

VALUES (1,400001,1,1),               
     (1,400001,2,110), 
     (1,400001,3,1001), 
     (1,400001,4,1100), 
     (2,400002,5,100), 
     (2,400002,6,102), 
     (2,400002,7,1003), 
     (2,400002,8,10004), 
     (3,400001,1,1), 
     (3,400001,2,110), 
     (3,400001,3,1001), 
     (3,400001,4,1200) 

INSERT INTO #Temp2 (setid,measurid,measurvalueid) 

    VALUES (400001,1,1), 
      (400001,2,110), 
      (400001,3,1001), 
      (400001,4,1100), 
      (400002,5,100), 
      (400002,6,102), 
      (400002,7,1003), 
      (400002,8,10004) 

我想輸出

EntryNo 
    1 
    2 

它包含兩組。

之一是:

(400001,1,1), 
    (400001,2,110), 
    (400001,3,1001), 
    (400001,4,1100) 

二是:

(400002,5,100), 
    (400002,6,102), 
    (400002,7,1003), 
    (400002,8,10004) 

回答

0

試試這個:

WITH DataSourceInialData AS 
(
    SELECT * 
      ,COUNT(*) OVER (PARTITION BY [entryNo], [setid]) AS [GroupCount] 
    FROM #Temp1 
), DataSourceFilteringData AS 
(
    SELECT * 
      ,COUNT(*) OVER (PARTITION BY [setid]) AS [GroupCount] 
    FROM #Temp2 
) 
SELECT A.[entryNo] 
FROM DataSourceInialData A 
INNER JOIN DataSourceFilteringData B 
    ON A.[setid] = B.[setid] 
    AND A.[measurid] = B.[measurid] 
    AND A.[measurvalueid] = B.[measurvalueid] 
    -- we are interested in groups which are passed completely by the filtering groups 
    AND A.[GroupCount] = B.[GroupCount] 
GROUP BY A.[entryNo] 
-- aftering joining the rows, the filtered rows must match the filtering rows 
HAVING COUNT(A.[setid]) = MAX(B.[GroupCount]); 

的算法很簡單:

  1. 我們看看有多少行每個數據組存在
  2. 我們指望有多少行每個過濾組存在
  3. 我們加入了初始數據和過濾數據
  4. 後加入我們指望有多少行被留在初始數據並且如果存在計數等於濾波計數給定組

,其結果是:

enter image description here

請注意,我正在檢查每場比賽。例如,如果在您的樣本數據中,entryNo = 1還有一行,它將不會包含在結果中。爲了改變這種行爲,請評論此行:

-- we are interested in groups which are passed completely by the filtering groups 
AND A.[GroupCount] = B.[GroupCount]