Этого можно достичь с помощью двух коррелированных подзапросов, используемых в качестве EXISTS
условий фильтрации.
SELECT t.id, t.color, t.size
FROM mytable t
WHERE
t.size IN ('2XL', '3XL')
AND EXISTS (SELECT 1 FROM mytable WHERE id = t.id AND color = t.color AND size = '2XL')
AND EXISTS (SELECT 1 FROM mytable WHERE id = t.id AND color = t.color AND size = '3XL')
Другое решение заключается в использовании самосоединения:
SELECT t.id, t.color, t.size
FROM mytable t
INNER JOIN mytable t2
ON t2.id = t.id
AND t2.color = t.color
AND (
( t.size = '2XL' AND t2.size = '3XL' )
OR ( t.size = '3XL' AND t2.size = '2XL' )
)
Мой совет состоит в том, чтобы сделать две вещи:
Большие инкременты не устраняют проблему выполнения большого переупорядочивания, но потребности сделать, большое переупорядочивание очень вряд ли и пакетное задание там для переупорядочения их, говорят один раз в день/неделю/месяц как требуется.
Изменение целого набора объектов сразу просто грязно и напрашивается на неприятности.
Если Вы действительно хотите закончить с непрерывным последовательным порядком, можно сделать это как это:
В первую очередь, умножьтесь sortorder
говорят 1000
UPDATE testtable SET sortorder = sortorder * 1000
Теперь сделайте свои вставки и вставьте подходящий sortorder
значения, чтобы иметь новые записи в правильном месте.
Теперь сделайте обновление таблицы и обновите значения с помощью функции ROW_NUMBER
UPDATE testtable
SET sortorder = subq.newsortorder
FROM
(
SELECT
ID as innerID,
ROW_NUMBER() OVER(ORDER BY sortorder ASC) as newsortorder
FROM testtable
) subq
WHERE subq.innerID = ID
Идентификатор выбран как innerID
поскольку обновленная таблица не может быть искажена, и столбец ID иначе закончился бы неоднозначный.
Это обновляет sortorder
с числом строки при сортировке по sortorder
.