По аналогии с @tombom.Предварительно запрашивайте только те столбцы, которые вам нужны, чтобы временная таблица была меньше.Если вы имеете дело с таблицей из 60 столбцов, вы заполняете намного больше, чем просто 3-4 столбца, в которых основное внимание уделяется действительным серийным номерам.Предварительно протестируйте запрос, чтобы убедиться, что он дает правильный набор, который вы ожидаете, а затем примените его к своему обновлению SQL.
Итак, внутренний запрос - это те, которые НЕ ХОТИТЕ ...вы сравниваете только столбец 1 и столбец 2 из этой таблицы, это все, что я предварительно запрашиваю.Затем я делаю левое соединение с этим внутренним набором результатов на COL1 и COL2.Я знаю, что вы хотите ИСКЛЮЧИТЬ ЭТУ НАЙДЕННУЮ В ЭТОМ наборе результатов ... Вот почему в предложении OUTER WHERE я добавил "AND ExcludeThese.Col1 IS NULL".Таким образом, любые экземпляры из OT1, которые никогда не существовали в подзапросе, хороши для выполнения (через левое соединение), и те, которые БЫЛИ НАЙДЕНЫ, будут иметь совпадение на col1 и col2, но ЭТО будет исключено через "и" предложение I 've описал.
SELECT OT1.SerialNumber
FROM OriginalTable OT1
LEFT JOIN ( select OT2.Col1,
OT2.Col2
FROM OriginalTable OT2
where OT2.type = 'Z'
AND OT2.flag <> 'S' ) ExcludeThese
ON OT1.Col1 = ExcludeThese.Col1
AND OT1.Col2 = ExcludeThese.Col2
WHERE OT1.type = 'S'
AND OT1.flag <> 'S'
AND ExcludeThese.Col1 IS NULL
ORDER BY
OT1.SerialNumber
INTO
TEMP TempTableA;
Опять же, протестируйте этот запрос самостоятельно, чтобы убедиться, что вы получаете ожидаемые записи.Чтобы уточнить возвращаемые записи, измените вышеприведенный выбор, чтобы включить в него больше столбцов для проверки психики / психического здоровья, например
SELECT OT1.SerialNumber,
OT1.Col1,
OT1.Col2,
ExcludeThese.Col1 JoinedCol1,
ExcludeThese.Col2 JoinedCol2
from <keep rest of query intact>
. Теперь вы сможете увидеть серийный номер и экземпляры этих столбцов.которые будут или не будут присоединены к результирующему набору «excludeThese» ... Попробуйте еще раз, но удалите только предложение «AND ExcludeThese.Col1 IS NULL», и вы увидите другие строки и ПОЧЕМУ они исключаются - то естьесли у вас есть какие-либо вопросы к содержанию.
Как только вы будете удовлетворены предварительным запросом ... который будет возвращать только один столбец SerialNumber, который можно индексировать / оптимизировать, так как вы тянете ввременная таблица, создайте индекс, затем примените свое обновление.
UPDATE OriginalTable
SET flag = 'D'
WHERE Serialnumber in ( select Serialnumber from TempTableA );