Комплексное обновление с использованием объединений и групп по - PullRequest
1 голос
/ 20 января 2011

Этот запрос выбирает идентификаторы из двух таблиц, в которых есть ровно однозначное совпадение имен

SELECT d.guest_id, h.host_id
FROM `guest` AS g 
JOIN `guest_data` AS d 
    ON d.guest_id = g.guest_id 
JOIN host_data AS h 
    ON d.guest_nm = h.host_nm 
GROUP BY
    h.venue_nm 
HAVING COUNT(*) = 1

Теперь у меня возникают проблемы при обновлении guest таблицы (g) для установки g.link_id = h.host_id

По сути, я хочу создать заявление вроде

UPDATE `guest` AS g , `host` h
SET g.link_id = h.host_id
WHERE g.guest_id = ... AND h.host_id = ... the pairs in the previous statement

Ответы [ 3 ]

5 голосов
/ 20 января 2011

Проблема, с которой вы можете столкнуться, состоит в том, что у вас может быть много строк host_data для каждого гостя, поэтому вы должны использовать агрегатную функцию (я использовал max ниже), чтобы добраться до одной строки, из которой вы хотите получить host_id. Я скорее специалист по SQL Server, но я думаю, что этот синтаксис довольно близок к тому, что вы будете использовать в MySQL. Вот мой выбор:

SELECT g.link_id, 
    (
        SELECT MAX(h.host_id)
        FROM guest_data d
        INNER JOIN host_data h ON d.guest_nm=hhost_nm
        GROUP BY h.venue_nm
        HAVING COUNT(*) = 1
    ) AS x
FROM guest g
WHERE g.guest_id IN 
(
    SELECT d.guest_id
    FROM guest_data d
    INNER JOIN host_data h ON d.guest_nm=hhost_nm
    GROUP BY h.venue_nm
    HAVING COUNT(*) = 1
)

После проверки, что select возвращает правильный набор результатов, вы можете легко преобразовать его в оператор UPDATE:

UPDATE guest g
SET link_id=
    (
        SELECT MAX(h.host_id)
        FROM guest_data d
        INNER JOIN host_data h ON d.guest_nm=hhost_nm
        WHERE d.guest_id=g.guest_id
        GROUP BY h.venue_nm
        HAVING COUNT(*) = 1
    )
WHERE g.guest_id IN 
(
    SELECT d.guest_id
    FROM guest_data d
    INNER JOIN host_data h ON d.guest_nm=hhost_nm
    GROUP BY h.venue_nm
    HAVING COUNT(*) = 1
)

Я надеюсь, что это достаточно близко, чтобы помочь ...

0 голосов
/ 16 сентября 2012

Посмотрев немного на синтаксис, я решил разбить операции и использовал тот же запрос SELECT, чтобы вставить INTO временную таблицу. Затем я выполнил ОБНОВЛЕНИЕ, используя типичный синтаксис JOIN.

Это дает дополнительное преимущество, заключающееся в возможности проверки результатов запроса перед отправкой в ​​вашу таблицу.

0 голосов
/ 20 января 2011

В Sql Server вы должны сделать что-то вроде

ОБНОВЛЕНИЕ гостя SET link_id = host_id ОТ гостя g ...

Я никогда не использовал mysql, поэтому пальцы скрещены.

...