У меня есть большая таблица с дублирующимися ключами, которую я пытаюсь подключить к меньшей таблице с уникальными ключами.Я точно знаю, что не будет совпадений для всего.Я хочу, чтобы совпадение из моей таблицы меньшего размера обновляло одну строку в таблице большего размера, а затем переходило к следующей строке таблицы меньшего размера для следующего обновления.Мне это нужно, потому что я пытаюсь создать уникальные идентификаторы в большой таблице, поскольку каждая строка представляет продукт реального мира, который имеет свою собственную иерархию объектов реального мира.
Так, например,
bigtable
barcodeSnippet t_stamp workId parentCase newId
aaaa time1 1 1 NULL
aaaa time1 1 1 NULL
aaaa time1 1 1 NULL
и моя маленькая таблица может иметь этот
smalltable
id barcodeSnippet t_stamp workId parentCase
1 aaaa time1 1 1
2 aaaa time1 1 1
конечный результат, который я хочу получить в своей большой таблице:
bigtable
barcodeSnippet t_stamp workId parentCase newId
aaaa time1 1 1 1
aaaa time1 1 1 2
aaaa time1 1 1 NULL
, где я выполнял только один раз для каждой строки и осталсяс NULL, поскольку у меня было 3 строки в большой таблице и два совпадения в моей меньшей.
Мой текущий запрос
UPDATE bigtable as bt
JOIN smallTable as st ON (bt.barcodeSnippet = b.barcodeSnippet AND
bt.parentCase= st.parentCase and bt.t_stamp = st.t_stamp and bt.workId =
st.workId)
SET bt.bottlesId = st.id;
не работает, и я не вижу возможностииспользовать LIMIT в ОБНОВЛЕНИИ для MySQL.Я видел другие ответы в MS SQL, где вы можете использовать TOP 1
, возможно, где newId IS NULL, но снова я использую MySQL здесь.
Я думаю, что мне может понадобиться использовать подход хранимой процедуры / курсорано даже при этом мне кажется, что я столкнусь с проблемой запуска оператора обновления, а затем вернусь к квадрату 1.
Есть идеи?Использование MySQL 5.6.
РЕДАКТИРОВАТЬ: думаю, у меня есть достойное решение.Я только что обновил свой запрос, поэтому у меня есть дубликаты.Однако теперь я добавил столбец с номером строки.Я планирую присоединиться к самой таблице и обновить ее, если номер строки <номер строки, поэтому я сохраняю верхний идентификатор и могу превратить остальные в ноль, что подходит. </p>
Что-то вроде этого
UPDATE bigtable tb
JOIN bigtable tb2 ON tb.newId = tb2.newId
SET tb.newId = NULL
WHERE tb.rowNumber < tb2.rowNumber;