ORM или что-то для обработки таблиц SQL со столбцом порядка эффективно

Этого можно достичь с помощью двух коррелированных подзапросов, используемых в качестве 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' )
    )
6
задан Touko 30 January 2009 в 12:38
поделиться

2 ответа

Мой совет состоит в том, чтобы сделать две вещи:

  1. Выберите очень большие инкременты между своими объектами, скажите один миллион. Таким образом, можно переместить объект в 8,000,000 к прежде 7,000,000 путем изменения просто его на 6,500,000; и
  2. Время от времени переупорядочьте объекты как пакетное задание.

Большие инкременты не устраняют проблему выполнения большого переупорядочивания, но потребности сделать, большое переупорядочивание очень вряд ли и пакетное задание там для переупорядочения их, говорят один раз в день/неделю/месяц как требуется.

Изменение целого набора объектов сразу просто грязно и напрашивается на неприятности.

5
ответ дан 10 December 2019 в 00:45
поделиться

Если Вы действительно хотите закончить с непрерывным последовательным порядком, можно сделать это как это:

В первую очередь, умножьтесь 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.

5
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: