Почему мой запрос на обновление не обновляется? - PullRequest
0 голосов
/ 22 января 2019

Я пытался выполнить запрос на обновление с информацией из другой таблицы, но как-то не работает, и я не могу понять, почему это

. Вот как я делаю запрос:

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
INNER JOIN  db_data ON x.sheet_expedient= db_data.sheet_expedient
WHERE x.sheet_expedient IS NULL

почему это не работает?заранее спасибо.

РЕДАКТИРОВАТЬ

Я вижу, что некоторые люди немного смущены структурой таблицы, вот она

dbo_expedient_reports

report_id|sheet_expedient|report_number|report_date|notificacion_date|report_status|
1        | NULL          | NULL        | NULL      | NULL            | NULL        |
2        | NULL          | NULL        | NULL      | NULL            | NULL        |
3        | NULL          | NULL        | NULL      | NULL            | NULL        |
4        | NULL          | NULL        | NULL      | NULL            | NULL        |
5        | NULL          | NULL        | NULL      | NULL            | NULL        |
6        | NULL          | NULL        | NULL      | NULL            | NULL        |
7        | NULL          | NULL        | NULL      | NULL            | NULL        | 
8        | NULL          | NULL        | NULL      | NULL            | NULL        |

db_data (эта информация содержит информацию, которую я хочу поместить в dbo_expedient_reports)

  sheet_expedient|report_date|name_expedient_owner|address_expedient|
  1              | 01-01-2011|mike                | his house 123   |
  2              | 06-06-2006|josh                | their house 456 |
  3              | 07-07-2007|andrew              | his place 789   |
  4              | 08-08-2008|frank               | somewhere 1111  |
  5              | 09-09-2009|chad                | anywhere 2222   |
  6              | 10-10-2010|zack                | nowhere 3333    |
  7              | 11-11-2011|steve               | everywhere 4444 |
  8              | 12-12-2012|mark                | here      5555  |

Основная идея заключается в том, что полезная информация листа поступает в отчеты dbo_expedient для экземпляра, а другие строки изВы можете подумать, что db_data - это еще одна таблица, в которую будет помещена информация. Целесообразно, чтобы лист соответствовал идентификатору, но это не так, поскольку sheet_expedient достигает предела (около 800), а затем начинается снова, поэтому он становится другим.из id, в то время как sheet_expedient наберет номер 800, затем начнется снова, поэтому id будет id 800 sheet_expedient 800, а затем id 801 sheet_expedient 1

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

Ответы [ 4 ]

0 голосов
/ 22 января 2019

На основании вашего комментария у вас есть JOIN в неправильном столбце. Вот исправление.

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
INNER JOIN  db_data ON x.report_id = db_data.sheet_expedient --here is the change
WHERE x.sheet_expedient IS NULL

Обратите внимание, все, что действительно нужно сделать, это дублировать столбец report_id. То есть столбец report_id будет соответствовать столбцу sheet_expedient для вашей таблицы dbo_expedient_reports. Я не уверен, в чем смысл этого.

Кроме того, предложение WHERE не требуется на основании данных этого примера.

0 голосов
/ 22 января 2019

Я не совсем уверен, чего бы вы хотели достичь.Если ожидается, что x.sheet_expedient будет NULL, тогда почему вы использовали его в соединении?Есть ли у вас какие-либо другие поля, которые вы можете использовать для объединения двух таблиц?

0 голосов
/ 22 января 2019

Чтобы проверить, попробуйте это:

WITH cte AS
    (SELECT         x.sheet_expedient       [FieldToUpdate]
     ,              db_data.sheet_expedient [NewValue]
     ,              *
       FROM         dbo_expedient_reports x
      INNER JOIN    db_data ON x.sheet_expedient = db_data.sheet_expedient
      WHERE         x.sheet_expedient IS NULL)
--UPDATE  cte    SET  [FieldToUpdate] = [NewValue];
SELECT  *   FROM  cte;

Я обычно оборачиваю свои обновления в cte перед их запуском.Позволяет мне видеть значения до и значения после.Хотя это не ответит на ваш вопрос, оно должно помочь вам определить причину.

Я закомментировал оператор обновления, как только выборка возвращает ожидаемые строки и значения, раскомментируйте обновление и закомментируйтевыбор.

0 голосов
/ 22 января 2019

Думаю, вам нужно левое соединение:

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
LEFT JOIN  db_data ON x.sheet_expedient= db_data.sheet_expedient
WHERE x.sheet_expedient IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...