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

  • IS NULL по сравнению с <> 1 бит SQL
  • Служба SQL Server не может быть запущена
  • Как исправить Microsoft SQL Server, ошибка: 262?
  • Выберите 1 запись из многих за период времени
  • Недетерминированный тип данных в SQL Server
  • В схеме SSDT Сравните, как игнорировать различия в объектах типа «Схема»,
  • Предоставление разрешений хранимой процедуре
  • Изменить скользящий индексный столбец
  • Выберите все элементы, которые соответствуют в поле «A», где одно из соответствующих полей содержит отдельное поле
  • Создать индексы для всех таблиц в базе данных?
  • MS SQL Query: конвертировать вывод даты и времени в другой формат.
  • Interesting Posts

    SQL: как сделать имя таблицы в динамической процедуре хранимой процедуры

    SQL Group By и присваивать наивысшее значение

    Сравнение SQL Server Best of X

    Поиск первой согласованной строки в столбце SQL Server

    Как сохранить значение последнего вставленного id (PK) в переменную, где первичный ключ является GUID в VB.Net

    В SQL Server 2005 есть способ установить схему по умолчанию на что угодно, кроме dbo, когда пользователь имеет права администратора?

    Как я могу вызвать хранимую процедуру SQL, используя EntityFramework 7 и Asp.Net 5

    Объединение строк в столбцы на SQL-сервере

    Использование операторов сравнения в предложении SELECT запроса T-SQL

    SQL UPDATE с CASE, GROUP BY и HAVING

    вычитать данные из одного столбца

    Заявление об обновлении TSQL Выполнение

    Среднее время и отображение в формате Specifc (Coldfusion)

    SQL Server: как использовать псевдоним в инструкции обновления?

    Обновление строк на основе rownumber в SQL Server 2012

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