SQL: сравнить две записи таблицы по записи

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

Declare Cursor c1 for SELECT * from Table1
OPEN c1
While @@Fetch_status=0
Begin
  Declare Cursor c2 for SELECT * from Table2
  OPEN c2
  WHILE @@Fetch_Status=0
  Begin
     /*Comparison happens here*/
  END
END

Должен ли я при обработке указывать, какой курсор я извлекаю, и как мне это сделать?

ИЗМЕНИТЬ

Для каждой записи в таблице 1 я хочу

  • Найдите в таблице 2 эту запись на основе первичного ключа.
  • Когда он найден, я хочу обновить значения дополнительных столбцов в таблице 2 на основе значения столбца в таблице 1.
  • Когда эта запись отсутствует в таблице 2, я хочу скопировать ее из таблицы 1 в таблицу 2 и установить значение по умолчанию для дополнительного столбца в таблице 2.

Открыт для других решений (не ограничиваясь курсорами)


person jpo    schedule 07.12.2012    source источник
comment
Почему бы вам не написать запрос как соединение?   -  person Gordon Linoff    schedule 07.12.2012
comment
вы должны предоставить информацию, о какой системе БД вы говорите.   -  person devanand    schedule 07.12.2012
comment
@GordonLinoff, что ты имеешь в виду? Как я могу это сделать?   -  person jpo    schedule 07.12.2012
comment
@wkaha как мне это сделать?   -  person jpo    schedule 07.12.2012
comment
Можете ли вы выбрать между ms sql, mysql, oracle, db2, .....?   -  person Hamlet Hakobyan    schedule 07.12.2012
comment
это система mysql, pgsql, oracle или mssql?   -  person devanand    schedule 07.12.2012
comment
Можете ли вы подробно объяснить эту фразу, сравнив две таблицы по записи?   -  person Hamlet Hakobyan    schedule 07.12.2012
comment
Извините, но когда у нас есть вопрос SQL, который задающий поднимает в комментариях How do I do a JOIN?, то, вероятно, это неподходящий вопрос для сайта.   -  person JNK    schedule 07.12.2012
comment
Извините, я не это имел в виду. Я хочу выполнить действие над записью, если она присутствует, и еще что-то над ней, если ее нет. Я тоже хочу сделать это в кратчайшие сроки. Я знаю, что объединение может быть настроено на возврат либо записей, найденных в обоих, либо записей, найденных в 1, а не в другом. Вот почему я задавался вопросом, будет ли это уместно в этой ситуации.   -  person jpo    schedule 07.12.2012
comment
@jpo, возможно, если вы расскажете нам обо всем, чего надеетесь достичь, мы сможем помочь вам с хорошим решением. в противном случае мы собираемся просто крутиться вокруг ветряных мельниц и брать SWAG и получать только ту информацию, которая нам нужна, после каждой неудачной/неудовлетворительной попытки.   -  person swasheck    schedule 07.12.2012
comment
@джпо . . . Я думаю, вам следует задать другой вопрос, предоставив больше информации о том, что вы пытаетесь сделать в блоках кода, и как вы определяете, присутствует ли строка в обеих таблицах.   -  person Gordon Linoff    schedule 07.12.2012
comment
Хорошо, вот оно: stackoverflow.com/q/13767575/807223   -  person jpo    schedule 07.12.2012
comment
Я думаю, что лучше отредактировать этот (как вы это сделали). Другой вопрос будет закрыт.   -  person ypercubeᵀᴹ    schedule 07.12.2012


Ответы (3)


Если таблицы имеют одинаковое определение столбца, самый быстрый способ - просто использовать предложение «кроме»:

SELECT * from Table1
except
SELECT * from Table2

также запустите его наоборот:

SELECT * from Table2
except
SELECT * from Table1

Вы увидите точную разницу в наборе:

ИСКЛЮЧАЯ и ПЕРЕСЕЧАТЬ

person alex    schedule 07.12.2012

У Redgate есть отличный инструмент для этого, если вы предпочитаете просто потратить несколько долларов:

Вы можете получить бесплатную пробную версию, чтобы увидеть, соответствует ли она вашим потребностям.

person E.J. Brennan    schedule 07.12.2012

Ты не можешь просто...

SELECT * FROM Table1 LEFT JOIN Table2 ON <your matching criteria>

... а затем выполнить INSERT для строк, правая «половина» которых равна NULL, и UPDATE для тех, чья правая половина не равна?

person Branko Dimitrijevic    schedule 07.12.2012