ОБНОВЛЕНИЕ ОТ ВЫБОРА с внешним ключом на родительском с одним запросом - PullRequest
0 голосов
/ 27 января 2012

Как обновить (изменить первое выбранное значение таблицы на второе) second_table.first_table_id, если first_table.email совпадает в обоих выбранных.

Если это вообще возможно.С одним запросом!

----------------------------------------- ОБНОВЛЕНИЕ -----------------------------------------

ПРИМЕР:

Мне нужно обновить внешний ключ второй таблицы, если поле электронной почты совпадает в первой таблице.Мне нужно сравнить два результата запроса с разными parent_id (родители находятся в одной таблице с детьми)

         table_1
 -------------------------
| id |  parent_id | email |
 -------------------------
  1     NULL       NULL      
  2     NULL       NULL
  3      1         joe@m.ru
  4      2         bob@f.ly
  5      1         bob@f.ly
  6      2         kira@.us

     table_2
 ----------------
| id |  first_id |
 ----------------
   1       3
   2       4
   3       5
   4       6
  1. У меня два родителя с идентификаторами 1 и 2 и некоторые дети (идентификаторы:3,4,5,6).

  2. Также имейте в виду: 1 - старый , 2 - новый

  3. Задание : изменить внешний ключ во второй таблице, если письма детей с parent_id = 1 и письма детей с parent_id = 2 совпадают (совпадают).

  4. В нашем примере во второй строке таблицы с id = 3 ее полем внешнего ключа - first_id должен измениться с 5 на 4 .

1 Ответ

1 голос
/ 27 января 2012

Следующие инструкции помогут вам начать работу

UPDATE  Table_2 t2u
SET     first_id = (
  SELECT  t2.first_id
  FROM    Table_2 t2
          INNER JOIN Table_1 t1 ON t1.id = t2.first_id
          INNER JOIN (
            SELECT  parent_id = MAX(parent_id), email
            FROM    Table_1
            GROUP BY
                    email
          ) t1p ON t1p.email = t1.email
          INNER JOIN Table_1 t1i ON   t1i.email = t1p.email
                                      AND t1i.parent_id = t1p.parent_id
  WHERE   t2u.first_id <> t1i.id)  

Тестовый скрипт (SQL Server)

;WITH Table_1 (id, parent_id, email) AS (
  SELECT 1, NULL, NULL      
  UNION ALL SELECT 2, NULL, NULL
  UNION ALL SELECT 3, 1, 'joe@m.ru'
  UNION ALL SELECT 4, 2, 'bob@f.ly'
  UNION ALL SELECT 5, 1, 'bob@f.ly'
  UNION ALL SELECT 6, 2, 'kira@.us'
)
, Table_2 (id, first_id) AS (
    SELECT 1, 3
    UNION ALL SELECT 2, 4
    UNION ALL SELECT 3, 5
    UNION ALL SELECT 4, 6
)
SELECT  t2.*, t1i.id as [update with]
FROM    Table_2 t2
        INNER JOIN Table_1 t1 ON t1.id = t2.first_id
        INNER JOIN (
          SELECT  parent_id = MAX(parent_id), email
          FROM    Table_1
          GROUP BY
                  email
        ) t1p ON t1p.email = t1.email
        INNER JOIN Table_1 t1i ON   t1i.email = t1p.email
                                    AND t1i.parent_id = t1p.parent_id
WHERE   t2.first_id <> t1i.id

Вывод

id          first_id    update with 
----------- ----------- -----------
3           5           4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...