#sql #sql-server #tsql
Вопрос:
У меня есть 2 вопроса. Первое-это то, чего я хочу достичь, однако это заняло слишком много времени. Вот как выглядел запрос:
SELECT *
FROM old_table
WHERE id NOT IN (SELECT id FROM new_table)
UNION ALL
SELECT *
FROM new_table
В принципе, мне нужно все, что есть в старой таблице, но не в новой таблице. Затем я объединяю все из старого и нового. Опять же, этот запрос занял слишком много времени для большего набора данных. Итак, я оптимизировал его так:
WITH union_tbl AS (
(SELECT * FROM old_table)
UNION ALL
(SELECT * FROM new_table)
), row_tbl AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY ordering) AS row
FROM union_tbl
)
SELECT *
FROM row_tbl
WHERE row = 1
В старой таблице и новой таблице (в отдельном запросе) Я добавляю новый столбец к каждому так называемому заказу. New_table получает 1 для всех своих строк. Для старой таблицы она получает 2 для всех ее строк. В конце концов, я выбираю, где номер строки равен 1. Таким образом, это означает, что если есть 2 строки, одна для new_table и одна для old_table, то вместо этого она должна получить строку new_table.
Именно так я себе это представляю, однако я не получаю тех же результатов, что и мой предыдущий запрос. Я бы ожидал, что у него будут те же самые точные результаты с теми же строками. Что я делаю не так? Является ли моя логика запроса неверной?
Комментарии:
1. пожалуйста, введите часть примерных данных и часть желаемых выходных данных.
2. Вам нужно изолировать данные, о которых идет речь, и проверить их, чтобы понять, в чем проблема. Кроме того, вы можете попробовать изменить исходный запрос для использования
NOT EXISTS
вместоNOT IN
и посмотреть, имеет ли это значение
Ответ №1:
Можете ли вы попробовать приведенный ниже код?
SELECT a.*
FROM old_table a left join new_table b on a.id=b.id
WHERE b.id IS NULL
UNION ALL
SELECT *
FROM new_table
Это очень оптимизированный способ