Обновление таблицы с собственной ссылкой в ​​Postgres обновляет больше записей, чем предполагалось - PullRequest
0 голосов
/ 04 июня 2018

У меня есть таблица с вопросами, которые ссылаются на ту же таблицу для родительских вопросов.

При выполнении запроса SELECT для всех записей строки для столбца title все эти вопросы отображаются в виде пары Запрос 1 / Результат 1 ниже.

Запрос 1:

SELECT t_child.title AS t_child_title, 
    t_child.question AS t_child_question, 
    t_child.parent_qid AS t_child_parent_qid, 
    t_child.language AS t_child_language, 
    t_parent.title AS t_parent_title, 
    t_parent.qid AS t_parent_qid, 
    t_parent.language as t_parent_language
FROM lime_questions AS t_child JOIN lime_questions AS t_parent
ON t_child.parent_qid = t_parent.qid AND t_child.language = t_parent.language
WHERE t_child.title = 'SacroCoccix';

Результат 1:

 t_child_title |   t_child_question    | t_child_parent_qid | t_child_language | t_parent_title | t_parent_qid | t_parent_language 
---------------+-----------------------+--------------------+------------------+----------------+--------------+-------------------
 SacroCoccix   | Sacro e/ou Cóccix     |               1095 | pt-BR            | lisCortAt      |         1095 | pt-BR
 SacroCoccix   | Sacrum and/or coccyx  |               1095 | en               | lisCortAt      |         1095 | en
 SacroCoccix   | Sacrum and/ or coccyx |               1078 | en               | lisFxAt        |         1078 | en
 SacroCoccix   | Sacro e/ou Cóccix     |               1078 | pt-BR            | lisFxAt        |         1078 | pt-BR
 SacroCoccix   | Sacro e/ou Cóccix     |               1056 | pt-BR            | lisCortPr      |         1056 | pt-BR
 SacroCoccix   | Sacrum and/or coccyx  |               1056 | en               | lisCortPr      |         1056 | en
 SacroCoccix   | Sacro e/ou cóccix     |                973 | pt-BR            | lisFxPr        |          973 | pt-BR
 SacroCoccix   | Sacrum and/or coccyx  |                973 | en               | lisFxPr        |          973 | en

Добавление фильтра t_parent = 'lisFxPr' кзапросить результаты ограничены заголовком родительского вопроса lisFxPr, так как пара Запрос 2 / Результат 2 ниже.

Запрос 2:

SELECT t_child.title AS t_child_title, 
    t_child.question AS t_child_question, 
    t_child.parent_qid AS t_child_parent_qid, 
    t_child.language AS t_child_language, 
    t_parent.title AS t_parent_title, 
    t_parent.qid AS t_parent_qid, 
    t_parent.language as t_parent_language
FROM lime_questions AS t_child JOIN lime_questions AS t_parent
ON t_child.parent_qid = t_parent.qid AND t_child.language = t_parent.language
WHERE t_child.title = 'SacroCoccix' AND t_parent.title = 'lisFxPr';

Результат 2:

 t_child_title |   t_child_question   | t_child_parent_qid | t_child_language | t_parent_title | t_parent_qid | t_parent_language 
---------------+----------------------+--------------------+------------------+----------------+--------------+-------------------
 SacroCoccix   | Sacro e/ou cóccix    |                973 | pt-BR            | lisFxPr        |          973 | pt-BR
 SacroCoccix   | Sacrum and/or coccyx |                973 | en               | lisFxPr        |          973 | en

Я хочу ОБНОВИТЬ только 2 строки, отображаемые в Результат 2 .

Я выполняю следующий запрос:

UPDATE lime_questions t_main SET title = 'SacrumCoccyx'
FROM lime_questions AS t_child 
JOIN lime_questions AS t_parent
ON t_parent.qid = t_child.parent_qid AND t_parent.language = t_child.language
WHERE t_main.title = 'SacroCoccix' AND t_parent.title = 'lisFxPr';

Но этот запрос UDPATE обновляет все 8 записей, отображаемых в Результат 1 .

Что мне не хватает, пожалуйста?

1 Ответ

0 голосов
/ 04 июня 2018

ОБНОВЛЕНИЕ синтаксиса:

[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table [ [ AS ] alias ]
    SET { column = { expression | DEFAULT } |
          ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
    [ FROM from_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

Вы можете попробовать этот запрос.

UPDATE lime_questions AS t_main 
SET title = 'SacrumCoccyx'
FROM lime_questions AS t_parent
WHERE t_main.title = 'SacroCoccix' AND 
t_parent.title = 'lisFxPr' AND 
t_parent.qid = t_main.parent_qid AND 
t_parent.language = t_main.language;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...