Как я могу выполнить это обновление таблицы, используя только SQL?

Я делаю некоторые преобразования базы данных, чтобы подготовить базу данных для обновления следующей версии моего приложения. Есть один конкретный сценарий, с которым я столкнулся, что я работаю как код C # в LINQPad (LINQPad запускает преобразование), но он waaaaayyyy медленный, и я хочу попробовать и преобразовать его в прямой SQL. В противном случае, похоже, что преобразование займет около двух дней, используя код C #, и я не могу отключить приложение так долго, чтобы это произошло. В сценарии я пытаюсь обновить столбец, который раньше не существовал. Рассмотрим следующие таблицы:

Таблица J (для @maccettura)

------ | Id | ------ | 1 | ------ 

Таблица P

 ------------------------- | Id | JId | DateAt | ------------------------- | 1 | 1 | 2017-01-01 | | 2 | 1 | 2017-02-01 | | 3 | 1 | 2017-03-01 | ------------------------- 

Таблица D

 ------------ | Id | JId | ------------ | 1 | 1 | | 2 | 1 | | 3 | 1 | ------------ 

Таблица DR

 --------------------- | Id | DId | DateAt | --------------------- | 1 | 1 | NULL | | 2 | 1 | NULL | | 3 | 2 | NULL | | 4 | 2 | NULL | | 5 | 3 | NULL | | 6 | 3 | NULL | --------------------- 

Я хочу обновить таблицу DR, чтобы даты были заполнены, и данные выглядят следующим образом:

 ------------------------- | Id | DId | DateAt | ------------------------- | 1 | 1 | 2017-01-01 | | 2 | 1 | 2017-02-01 | | 3 | 2 | 2017-01-01 | | 4 | 2 | 2017-02-01 | | 5 | 3 | 2017-01-01 | | 6 | 3 | 2017-02-01 | ------------------------- 

Однако я просто не могу выразить это в SQL. Я попытался возиться с выбором в temp-таблицы, пытаясь сопоставить номер строки и т. Д., Но я просто недостаточно квалифицирован для SQL, чтобы заставить его работать. Я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении. Если это имеет значение, вот как выглядит форма пользовательского интерфейса:

  ----------------- ------------- | D.Id | D.Id | | 1 | 2 | 3 | ---------------------------- => ------------------------ | P.DateAt | DR.Id | DR.Id | | 1/1/2017 | 1 | 3 | 5 | | P.DateAt | DR.Id | DR.Id | | 1/2/2017 | 2 | 4 | 6 | ---------------------------- ------------------------ 

Я пытаюсь сделать все это, потому что в обновлении приложения я сортирую строки DateAt столбцом DateAt . В текущей версии, если пользователь добавляет дату не в порядке, кто-то переводит все данные, чтобы даты были в порядке. Как вы можете себе представить, это огромная трата времени, поэтому я хочу сделать это неуместным, что такое порядок входа, но отображать его так, как должно быть.

Единственное «отношение», которое у меня есть, это порядок столбцов Id в таблицах P и DR . Первая строка P – это первая дата, а последняя строка P – это последняя дата. Первая строка DR для первой даты, а последняя строка DR – для последней даты.

О, и база данных – это SQL Server 2012. Заранее благодарим за любую помощь!

Это будет работать:

 UPDATE DR SET DR.DATEAT = P.DATEAT FROM (SELECT ID, DId, DATEAT, ROW_NUMBER() OVER (PARTITION BY DId ORDER BY ID) RN FROM DR) DR JOIN P ON P.ID = DR.RN 

В основном это говорит о том, что если это первая строка для нового DId , тогда используйте первую дату из таблицы P , затем вторую строку на вторую дату и т. Д.

SELECT чтобы увидеть логику:

 SELECT * FROM (SELECT ID, DId, DATEAT, ROW_NUMBER() OVER (PARTITION BY DId ORDER BY ID) RN FROM DR) DR JOIN P ON P.ID = DR.RN 

SELECT результаты:

Результаты SELECT

DR после обновления:

DR после обновления

EDIT Похоже, что таблица P не имеет надежных id . Вы можете создать их с другим использованием ROW_NUMBER() если необходимо:

 SELECT * FROM (SELECT ID, DId, DateAt, ROW_NUMBER() OVER (PARTITION BY DId ORDER BY ID) RN FROM DR) DR JOIN (SELECT DateAt, ROW_NUMBER() OVER (ORDER BY DateAt ASC) as ID FROM P ) P ON P.ID = DR.RN 

Обязательно сначала создайте резервную копию своей базы данных, но инструкция update с предложением from должна делать то, что вам нужно:

 update dr set dr.DateAt = p.DateAt from p where dr.id = p.id 

Примечание:

Если у вас еще нет индекса для id для обеих таблиц, вы, вероятно, захотите добавить его до этого. Если ваш стол большой, это займет некоторое время, если вы будете выполнять полное сканирование таблицы.

  • ИСПОЛЬЗОВАНИЕ ИСПОЛЬЗОВАНИЯ
  • не может войти в сервер sql с новым пользователем
  • УДАЛИТЬ определенные строки, соответствующие всем значениям
  • Как запросить или вставить значение в двоичное (1) поле в SQL Server 2012?
  • SQL объединяет 2 таблицы без отношения
  • Строка подключения для SQL Server Express на удаленном компьютере Ошибка входа в систему
  • объединение нескольких строк в одну строку на сервере sql
  • Поиск запроса для возврата значения данных при изменении данных в противном случае возвращает пространство ''
  • SQL Server 2012 - Лучший способ присвоить увеличивающееся число для разных наборов записей с определенного значения
  • Использование временных функций или процедур в скрипте
  • Получение ужасной производительности на вновь созданных видах
  • Interesting Posts

    Как регистрировать изменения, внесенные пользователями системы?

    Проблемы с использованием ОДНОГО РАЗРЕШЕНИЯ

    Получение дубликатов значений и суммирование второго столбца в SQL

    Неверный синтаксис SQL при попытке вставить строку в базу данных

    Как найти все таблицы, содержащие столбец с именем

    Скрытие баз данных для входа в Microsoft Sql Server 2008R2 и выше

    Постоянство HornetQ с использованием сервера MS SQL

    Получить первую / последнюю строку n-й последовательной группы

    Сервер Sql: все зависимые объекты

    Развертывание с использованием TFS 2012 SQL Project Не включая сценарий развертывания Post

    Обновление множественных отношений «многие-ко-многим»

    Добавление пользователя и пользователя на SQL Server без использования SMO

    Как определить отношения в РСУБД?

    T-SQL MERGE – выяснение, какие действия потребовалось

    База данных Azure SQL "Не удалось найти хранимую процедуру sp_linkedservers" через SSMS

    Давайте будем гением компьютера.