Информация об обновлении SQL с использованием другой записи из той же таблицы - PullRequest
1 голос
/ 14 марта 2012

http://imageshack.us/photo/my-images/839/noeuds.jpg/

Только что добавил ссылку на реальную таблицу. Noeud 116 должен иметь INSEE_COM, обновленный информацией о 117. (116 связан как N_AMONT в 117 записи)


У меня есть эта таблица (noueds):

NOEUD   TYPE_MAT  N_AMONT   LONG_CABLE   ADDRESS
123     REP       100       12           abc
130     AMP       229       12            
173     PPP       130        1           AAA

Я хотел бы написать запрос ОБНОВИТЬ, чтобы заполнить все АДРЕСА данных от узла после того, который имеет NODES.LONG_CABLE = 1.

Например:

Я искал все узлы, которые имеют LONG_CABLE = 1, дает мне 173; тогда узел до 130 должен иметь тот же адрес 173.

Я могу искать все узлы, которые будут обновлены:

SELECT *
  FROM noeuds AS tab,
       [SELECT noeuds.* FROM noeuds WHERE (((noeuds.LONG_CABLE)="    1"))]. AS a1
 WHERE (((tab.NOEUD)=([a1].[n_amont])) AND ((tab.ADDRESS)="     "));

Я использую MS Access.

EDIT:

Обновляет только записи, выбранные для 1м кальбе. Кто-нибудь знает, как сделать так, чтобы он обновлял те, которые указаны в noeuds.n_amont не в выбранной таблице, а в исходной, называемой noeuds?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

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

FirstQ

SELECT n.NOEUD, n.ADDRESS, 
     (SELECT TOP 1 Noeud 
      FROM Noeuds WHERE Noeud<n.Noeud 
      ORDER BY Noeud DESC) AS CodeToUpdate
FROM noeuds AS n
WHERE n.LONG_CABLE="1"
ORDER BY n.NOEUD

Обновление

UPDATE noeuds 
INNER JOIN FirstQ 
ON noeuds.NOEUD = FirstQ.CodeToUpdate 
SET noeuds.ADDRESS = [FirstQ].[ADDRESS]</s>

РЕДАКТИРОВАТЬ Комментарий

SELECT a.noeud,
       a.long_cable,
       a.address,
       noeuds_1.n_amont,
       noeuds_1.address
FROM   (SELECT *
        FROM   noeuds
        WHERE  long_cable = '1') AS a
       INNER JOIN noeuds AS noeuds_1
         ON a.n_amont = noeuds_1.noeud; 

Обновление № 2

UPDATE (SELECT n_amont,
               address
        FROM   noeuds
        WHERE  long_cable = '1') AS a
       INNER JOIN noeuds AS n
         ON a.n_amont = n.noeud
SET    n.address = a.Address
WHERE  n.address IS NULL
0 голосов
/ 14 марта 2012

Учитывая, что этот узел

  • не начинается с 1
  • предыдущий узел не всегда = узел № -1

Вы можете сделатьследующее (хотя не уверен, что он работает с доступом):

UPDATE TableName  
SET spalteA = t2.SpalteB
FROM TableName AS t1
INNER JOIN TableName AS t2
ON t2.node = t1.node - 1
WHERE t1.node > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...