Как я могу выполнить это обновление таблицы, используя только 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 для обеих таблиц, вы, вероятно, захотите добавить его до этого. Если ваш стол большой, это займет некоторое время, если вы будете выполнять полное сканирование таблицы.

  • Принцип dbo не существует на сервере Sql
  • Возврат 4 самых последних заказов для каждого клиента
  • Использование пространственного индекса
  • как я могу объединить горизонтальное и вертикальное разбиение на SQL-сервере
  • Объединение родителей в 2 таблицы с точным соответствием значений дочерних строк
  • BizTalk с Visual Studio - шаги для запроса SQL Server?
  • SQL GROUP BY по второму запросу
  • Сбой CLR при первом использовании из-за неиспользуемой переменной
  • Исключить дублированные проверки - SQL
  • Запрос Linq не ведет себя так, как ожидалось
  • показать значение из текста .. ограничено; показать только первое значение
  • Interesting Posts

    Блокировка строки в SQL Server 2005-2008

    Оптимизация предложения WHERE SQL-запроса

    Джерси JAX-RS автогенерируемые веб-сервисы и поля MSSQL Identity

    Топ-3 ряда на страну

    Count Sub Total и Total in Dynamic Pivot Sql

    Как проверить данные и время создания таблицы в IBM Netezza SQL из инструментария Aginity

    Альтернатива программе просмотра отчетов для служб отчетов SQL

    SQL Server: объединить несколько строк в один, не перекрывая, а новые столбцы

    SQL Server 2008R2 Отчеты SSRS не могут подключаться к источнику данных: невозможно создать соединение с источником данных

    Какая идентификация используется и аутентифицируется при подключении к SQL Server с проверкой подлинности Windows?

    Как предоставить доступ к агенту SQL Server для записи / изменения системных файлов?

    SQL Server: запрос для DENSE_RANK (), сгруппированный по столбцу?

    T-SQL возвращает строку, если другой строки не существует

    Дизайн базы данных – сложная проблема с ключевыми отношениями

    Выберите значения разделения с соответствующими идентификаторами

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