2016-02-04 121 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()