2016-01-15 3 views
1

У меня есть эта диаграмма. UserId для обеих таблиц одинаковый (используйте его как внешний ключ). 0 Как определить, где UserId не требуется в таблице UserAdditioStamp, а затем эти данные входят в таблицу UserAdditioStamp.Вставьте данные, если они не существуют

enter image description here

SELECT 
    min(ev.UserId) as UserId, ev.Value, 
    min(uas.UserId) as AdditionUserId, 
    max(uas.[TimeStamp]) as AdditionTimestamp, 
    count(ev.UserId) as [Registrations] 
FROM 
    EventLog ev 
LEFT JOIN 
    UserAdditionStamp uas ON ev.UserId = uas.UserId 
WHERE 
    uas.UserId IS NULL 
    AND EventTypeId = 3 
    AND Value IS NOT NULL 
GROUP BY 
    ev.Value 
ORDER BY 
    UserId 

Я пытаюсь, что для выбора, но это дает неправильный результат о регистрации подсчитывать (там должно быть 2 для регистрации UserId = 10, 2 для 13 и т.д.)

UserId AdditionUserId AdditionTimestamp [Registrations] 
3  NULL    NULL   1 
10  NULL    NULL   1 
10  NULL    NULL   1 
13  NULL    NULL   1 
13  NULL    NULL   1 

, а затем я хочу вставить эти данные в таблицу UserAdditioStamp. Как это возможно?

+0

Вы хотите, чтобы вставить UserId и TimeStamp из EventLog в UserAdditionStamp таблицу, если UserId не существует в UserAdditionStamp? or Значение TimeStamp отличается от таблицы EventLog? –

+0

Да, я хочу вставить UserId и TimeStamp из EventLog в таблицу UserAdditionStamp, если UserId не существует в UserAdditionStamp @DMayuri – gsiradze

+0

, пожалуйста, см. Мой ответ, который может вам помочь –

ответ

1
INSERT INTO UserAdditionStamp 
SELECT e.UserId, e.TimeStamp 
FROM EventLog e 
WHERE NOT EXISTS (SELECT UserId FROM UserAdditionStamp WHERE UserId = e.UserId) 

ИЛИ

INSERT INTO UserAdditionStamp 
SELECT e.UserId, e.TimeStamp 
FROM EventLog e 
WHERE e.UserId NOT IN (SELECT UserId FROM UserAdditionStamp) 
0

Если я правильно понял:

insert into UserAdditionStamp (UserId, TimeStamp) 
select UserId, TimeStamp 
from EventLog 
where (userId not in (select UserId from UserAdditionStamp)) 
0

Я не понимаю вашего вопроса. Вы говорите о вставке данных, а затем говорите о группе по выбранной проблеме. Если ядро ​​вашего вопроса

Я хочу, чтобы вставить UserId и TimeStamp из EventLog в UserAdditionStamp таблицу, если UserId не существует в UserAdditionStamp

затем читаемый путь к пользователю merge, подход :

; WITH E as 
(select e.UserId, MAX(e.TimeStamp ) as TimeStamp 
FROM EventLog e 
GROUP BY e.UserId 
) 
MERGE UserAdditionStamp AS TARGET 
USING E as SOURCE 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (UserId, TimeStamp) 
    VALUES (SOURCE.UserId, SOURCE.TimeStamp) 
END; 

Но согласно MS performance tip:

Совет по производительности: Условное поведение, описанное для оператора MERGE, лучше всего работает, когда две таблицы имеют сложную смесь совпадающих характеристик. Например, вставка строки, если она не существует, или обновление строки, если она соответствует. При простом обновлении одной таблицы на основе строк другой таблицы улучшенная производительность и масштабируемость могут быть достигнуты с помощью основных инструкций INSERT, UPDATE и DELETE.

вы получите более высокую производительность, используя простую вставку:

INSERT UserAdditionStamp (UserId, TimeStamp) 
SELECT e.UserId, MAX(e.TimeStamp ) as TimeStamp 
FROM EventLog e 
WHERE NOT EXISTS (SELECT 1 
        FROM UserAdditionStamp A2 
        WHERE A2.UserId = e.UserId) 
GROUP BY e.UserId 
; 
+0

Когда я выполняю ваш код, он говорит Невозможно вставить значение NULL в столбец 'UserId ', table .. – gsiradze

+0

'where ... и e.UserId не null' – danihp

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