проверяя, существует ли такая же строка в таблице или нет [дубликат]

2017 ответ: теперь вы можете делать то, что хотите, в каждом текущем браузере и узле

. Это довольно просто:

  • Вернуть обещание
  • Используйте 'await' , в котором JavaScript ожидает, что обещание будет разрешено в vlue (например, hTTP-ответ)
  • Добавьте 'async' для родительской функции

Вот рабочая версия вашего кода:

(async function(){

var response = await superagent.get('...')
console.log(response)

})()

ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]

50
задан Hamid Nazari 24 February 2014 в 14:31
поделиться

6 ответов

Предполагая, что вы хотите получить фактический оператор SQL Server MERGE :

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh);

Если вы также хотите удалить записи в целевом объекте, которых нет в источнике:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Поскольку это стало немного более популярным, мне кажется, что я должен немного расширить этот ответ с некоторыми оговорками, о которых нужно знать.

Во-первых, там это несколько блогов, которые сообщают о проблемах с параллелизмом с оператором MERGE в старых версиях SQL Server. Я не знаю, был ли этот вопрос когда-либо рассмотрен в последующих выпусках. В любом случае это можно в значительной степени решить, указав подсказку блокировки HOLDLOCK или SERIALIZABLE:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]

Вы также можете выполнить одно и то же с более строгими уровнями изоляции транзакций.

Есть несколько других известных проблем с MERGE. (Обратите внимание, что поскольку Microsoft nuked Connect и не связала проблемы в старой системе с проблемами в новой системе, эти старые проблемы трудно отследить. Спасибо, Microsoft!) Из того, что я могу сказать, большинство из них не являются обычными проблемы или могут быть обработаны с теми же подсказками, что и выше, но я их не тестировал.

Как бы то ни было, хотя у меня никогда не было проблем с утверждением MERGE Я всегда использую подсказку WITH (HOLDLOCK) сейчас, и я предпочитаю использовать это утверждение только в самых простых случаях.

104
ответ дан Bacon Bits 31 August 2018 в 17:19
поделиться
UPDATE ed
SET ed.kWh = ted.kWh
FROM energydata ed
INNER JOIN temp_energydata ted ON ted.webmeterID = ed.webmeterID
0
ответ дан Andrey Gordeev 31 August 2018 в 17:19
поделиться
Update energydata set energydata.kWh = temp.kWh 
where energydata.webmeterID = (select webmeterID from temp_energydata as temp) 
0
ответ дан Azade 31 August 2018 в 17:19
поделиться

Я часто использовал Bacon Bits отличный ответ, поскольку я просто не могу запомнить синтаксис.

Но я обычно добавляю CTE в качестве дополнения, чтобы сделать часть DELETE более полезной, потому что очень часто вы захотите применить слияние только к части целевой таблицы.

WITH target as (
    SELECT * FROM dbo.energydate WHERE DateTime > GETDATE()
)
MERGE INTO target WITH (HOLDLOCK)
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE
13
ответ дан Bridge 31 August 2018 в 17:19
поделиться

Если вам нужно просто обновить свои записи в energydata на основе данных в temp_energydata, считая, что temp_enerydata не содержит никаких новых записей, попробуйте это:

UPDATE e SET e.kWh = t.kWh
  FROM energydata e INNER JOIN 
       temp_energydata t ON e.webmeterID = t.webmeterID AND 
                            e.DateTime = t.DateTime

Здесь работает sqlfiddle

Но если temp_energydata содержит новые записи, и вам нужно вставить его в energydata предпочтительно с одним утверждением, то вам обязательно следует ответить, что Bacon Bits дал.

3
ответ дан peterm 31 August 2018 в 17:19
поделиться

ПРАВИЛЬНЫЙ ПУТЬ:

UPDATE test1
INNER JOIN test2 ON (test1.id = test2.id)
SET test1.data = test2.data
-6
ответ дан Rudolf Rein 31 August 2018 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: