2016-02-04 126 views
0

我有以下查詢,我正在處理。目標是在不插入重複項的情況下插入符合where子句中的條件的[AppID]和隨機選擇的[ufid]。我研究了TABLESAMPLE和Random(),但無法弄清楚。SQL INSERT ISSUE WITH CTE

例如:#mult_nuf表有4個AppID = 123456和Major ='GEBOX'的記錄。 #temp_rUF將在ufid ='UF7'和sh_plan ='GEBOX'的表中有一個記錄。我需要將另一個[sh_plan]的[App_ID]和[ufid]插入臨時表中WHERE [Major ]和[sh_plan]不一樣。到目前爲止,每個[ufid]的記錄都以相同的[Appid]插入。我在表中有45個[ufid},所以臨時表有45個相同的[AppID]記錄。應該只有4個紀錄爲[的AppID]與4個隨機[UFID] ..

mult_nuf表

AppID    Major 
004540036   GEBOX 
004540036   GEBOX 
004540036   GEBOX 
004540036   GEBOX 

的#temp_ruf表

ufID     sh_Plan 
U1     GECCE 
U2     REDSG 
U5     GFRTY 
U7     GEBOX 
U8     JKIUTY 

樣本輸出應該像

App_ID    ufID 
004540036    U1 
004540036    U2 
004540036    U5 
004540036    U8 

查詢我正在與

WITH Match_NomineesWithReviewers AS 
(
    SELECT DISTINCT 
     [AppID], 
     RTRIM(Major) AS Major 
    FROM 
     #mult_nuf 
) 
SELECT 
    m.[AppID], 
    r.ufid 
INTO 
    #TempNTable 
FROM 
    Match_NWithR m 
CROSS APPLY 
    (SELECT ir.ufid 
    FROM #temp_rUF ir 
    WHERE m.Major <> ir.sh_plan) r 
+2

這個問題確實需要根據這些數據樣本數據和樣本輸出。 –

+0

我添加了示例數據和輸出。 thxs – Rugster

+0

這很混亂,因爲你描述的內容與你提供的數據不匹配。例如sh_plan和ufid在你的例子中沒有被命名。 – SQLChao

回答

0

假設你想這樣做,一組的AppID的,我會使用ROW_NUMBER和ORDER BY NEWID()爲隨機的,那麼限制前4分的結果,這樣的事情:

WITH Match_NomineesWithReviewers AS 
(
    SELECT 
     [AppID], 
     RTRIM(Major) AS Major 
    FROM 
     #mult_nuf 
    GROUP BY 
     [AppID], 
     RTRIM(Major) 
) 
, rownum_matches AS (
SELECT 
    m.[AppID], 
    r.ufid, 
    ROW_NUMBER() OVER (PARTITION BY m.[AppID] ORDER BY newid()) AS rownum 
FROM 
    Match_NomineesWithReviewers m 
JOIN 
    #temp_rUF t ON t.sh_Plan != m.Major 
) 
SELECT [AppID], ufid FROM rownum_matches WHERE rownum <= 4 

如果你需要它原來的號碼的記錄,也許是這樣的搭配:

WITH Match_NomineesWithReviewers AS 
(
    SELECT 
     [AppID], 
     RTRIM(Major) AS Major, 
     COUNT(1) AS rowcnt 
    FROM 
     #mult_nuf 
    GROUP BY 
     [AppID], 
     RTRIM(Major) 
) 
, rownum_matches AS (
SELECT 
    m.[AppID], 
    r.ufid, 
    m.rowcnt, 
    ROW_NUMBER() OVER (PARTITION BY m.[AppID] ORDER BY newid()) AS rownum 
FROM 
    Match_NomineesWithReviewers m 
JOIN 
    #temp_rUF t ON t.sh_Plan != m.Major 
) 
SELECT [AppID], ufid FROM rownum_matches rm WHERE rownum <= rowcnt 
+0

此解決方案適用於我的原始帖子。但是我沒有意識到[r.ufid]可以插入臨時表的次數是基於一個名爲@RevsRev(設置爲42)的變量。任何想法的最佳方式來添加該功能?不知道我是否需要創建一個新的問題,因爲我發佈的原始問題已被回答? – Rugster

+0

你只需要將結果限制爲42或者是否需要提前完成?像WHERE rownum <= rowcnt AND rownum <= @RevsRev可以在前一種情況下工作。 – vanlee1987

0

你可以嘗試這樣的事情。它應該工作,如果appid都是一樣的。

INSERT INTO ATempTable 
SELECT TOP (SELECT COUNT(1) FROM mult_nuf) Appid, 
    ufID 
FROM 
    (SELECT DISTINCT * 
    FROM mult_nuf 
    CROSS JOIN temp_ruf 
    WHERE major <> sh_plan) BaseQuery 
ORDER BY NEWID()