2013-11-26 4 views
-1

У меня есть одна таблица, и она состоит из множества столбцов, а две из них - group_id и access_id.Now проблема вызвана из-за несогласованности записей следующим образом: записей в формате изSQL Query для обновления в отдельной таблице

group_id access_id 

100  1, 
200  1, 
300  1, 
400  1, 
100  2, 
200  2, 
300  2, 
400  2, 
100  3, 
400  3, 
100  4, 
300  4, 

так что вы можете видеть, что нет записи в таблице для записей (group_id,access_id)-> (200,3),(300,3),(200,4),(400,4) .. есть неизвестное количество групп, данные на сервере производства и от 1 до 12 access_id для каждого group_id. , поэтому мне нужно сформировать запрос, который вставляет все записи для отсутствующей пары (group_id, access_id). - (Извините за плохих навыков редактирования)

+0

Добро пожаловать в StackOverflow: если вы разместите код, XML или данных образцов, пожалуйста ** ** выделить те строки в текстовом редакторе и нажмите на «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

+1

у вас что-то пробовали ???? –

ответ

0
CREATE PROCEDURE EXAMPLE 
    ( 
     @accessid_range INT 
    ) 
    AS 
    BEGIN 

     CREATE TABLE #LocalTempTable(group_id_temp INT, frequency INT) 
     INSERT INTO #LocalTempTable(group_id_temp, frequency) 
     (SELECT group_id,COUNT(group_id) AS frequency FROM SAMPLE2 GROUP BY group_id HAVING COUNT(group_id)<4); 
     --SELECT * FROM #LocalTempTable; 

     --SELECT group_id, access_id from SAMPLE2 WHERE group_id IN 
     --(SELECT group_id_temp FROM #LocalTempTable) GROUP BY group_id, access_id; 

     DECLARE @GROUPID INT 
     DECLARE GROUPIDs CURSOR LOCAL FOR SELECT group_id_temp FROM #LocalTempTable; 

     OPEN GROUPIDs 
      FETCH NEXT FROM GROUPIDs into @GROUPID 
       WHILE @@FETCH_STATUS = 0 
        BEGIN 
         --PRINT(@GROUPID) 
    --*********************************************************************************************************************** 
         DECLARE @ACCESSID INT, 
           @COUNTER INT=1; 
         DECLARE ACSESSIDs CURSOR LOCAL FOR SELECT access_id FROM SAMPLE2 WHERE [email protected] ORDER BY access_id; 

         OPEN ACSESSIDs 
          FETCH NEXT FROM ACSESSIDs into @ACCESSID 
           WHILE (@COUNTER <[email protected]_range) 
            BEGIN 
             --PRINT(@ACCESSID); 

              IF(@ACCESSID != @COUNTER) 
               INSERT INTO SAMPLE2 VALUES(@GROUPID,@COUNTER) 

             SET @COUNTER = @COUNTER + 1 
             FETCH NEXT FROM ACSESSIDs INTO @ACCESSID 
            END 
         CLOSE ACSESSIDs 
         DEALLOCATE ACSESSIDs 
    --************************************************************************************************************************* 
         FETCH NEXT FROM GROUPIDs into @GROUPID 
        END 
     CLOSE GROUPIDs 
    END 
+0

Курсоры занимают слишком много нагрузки – Nisha

2
INSERT INTO yourTable 
SELECT group_id, t.x AS access_id 
FROM yourTable CROSS JOIN 
(
SELECT p.x FROM 
(
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12) 
) P(x) 
) AS t 
EXCEPT 
SELECT group_id, access_id FROM yourTable 

попробуйте этот код Заменить yourTable на реальное имя таблицы. И первым совершить INSERT заявление для видете оператора SELECT

Смежные вопросы