У меня есть следующий SQL, который работает, чтобы найти дубликатыSQL Server 2008 - Поиск дубликатов с использованием ROW_NUMBER
SELECT *
FROM (SELECT
id,
ShipAddress,
ShipZIPPostal,
ROW_NUMBER() OVER (PARTITION BY shipaddress, shipzippostal ORDER BY shipaddress) ROWNUM
FROM orders
WHERE CONVERT(date, orderdate) = CONVERT(date, GETDATE())) x
WHERE rownum > 1
Я хотел бы видеть только строки, в которых, если значение RowNum> 1, то я хотел бы видеть его соответствующая строка, где rownum = 1.
Так что, если строка имеет дубликаты, я хочу видеть исходную строку и все ее дубликаты.
Если строка не имеет дубликатов, то я не хочу видеть его (он будет иметь ROWNUM = 1)
Как бы я это сделать, пожалуйста?
веселит
Ваш первый подход не будет работать, в 'x' в 'where exists' не определен. Я согласен, что CTE - это более чистое решение (если требуется 'row_number') – HoneyBadger
Ну в первом подходе' x' является псевдонимом производной таблицы в основном запросе. Я не тестировал, но я думаю, что функция EXISTS() будет иметь к ней доступ. При использовании подхода CTE это обязательно должно работать. –
Нет, он не работает, он работает только в предложении 'where', где вы связываете условие where с основным запросом. Вам нужно будет переписать определение таблицы 'x' для выбора из' exist'. Вот почему CTE намного лучше. – HoneyBadger