2 Запроса, чтобы сделать то же самое, не работают

#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
 

Это очень оптимизированный способ