Удаление строк из таблицы, заданной выбором из той же и другой таблицы (внутреннее соединение) - PullRequest
0 голосов
/ 06 июня 2019

Мне нужно удалить несколько строк из моей БД, которые я выбрал с помощью оператора SQL выбора

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

DELETE FROM OBSERVATION WHERE OBSERVATION.ID in
(SELECT OBSERVATION.ID from OBSERVATION
inner join SPECIMEN on SPECIMEN.ID=OBSERVATION.SPECIMEN_ID
WHERE SPECIMEN.GENDER="male"and OBSERVATION.VALUE_TERM is not null and OBSERVATION.PARAMETER_STABLE_ID="IMPC_PAT_028_002")

Я всегда получаю ошибку:

Ошибка в запросе (1093): невозможно указать целевую таблицу 'НАБЛЮДЕНИЕ' для обновления в предложении FROM

Ответы [ 4 ]

0 голосов
/ 06 июня 2019
DELETE targetTable
FROM targetTable
INNER JOIN otherTable
    ON targetTable.col = otherTable.col
WHERE otherTable.col2 = “foo”
0 голосов
/ 06 июня 2019

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

Вы можете использовать внутреннее соединение в подзапросе, а не в предложении
этого должно быть достаточно

DELETE 
FROM OBSERVATION 
INNER JOIN  (
    SELECT OBSERVATION.ID 
    from OBSERVATION
    inner join SPECIMEN on SPECIMEN.ID=OBSERVATION.SPECIMEN_ID
    WHERE SPECIMEN.GENDER="male"
    and OBSERVATION.VALUE_TERM is not null
     and OBSERVATION.PARAMETER_STABLE_ID="IMPC_PAT_028_002"
)  t  OBSERVATION.ID = t.ID 

в противном случае вам нужно применить этот способ

DELETE 
FROM OBSERVATION 
INNER JOIN  (
  select id from( 
    SELECT OBSERVATION.ID 
    from OBSERVATION
    inner join SPECIMEN on SPECIMEN.ID=OBSERVATION.SPECIMEN_ID
    WHERE SPECIMEN.GENDER="male"
    and OBSERVATION.VALUE_TERM is not null
     and OBSERVATION.PARAMETER_STABLE_ID="IMPC_PAT_028_002"

     ) t1
)  t  OBSERVATION.ID = t.ID 
0 голосов
/ 06 июня 2019

При условии, что наблюдение.id является ПЕРВИЧНЫМ КЛЮЧОМ, почему бы не использовать:

DELETE o
  FROM observation o
  JOIN specimen s
    ON s.id = o.specimen_id
 WHERE s.gender = 'male' 
   AND o.value_term IS NOT NULL 
   AND o.parameter_stable_id = 'IMPC_PAT_028_002'
0 голосов
/ 06 июня 2019

Поскольку вы используете OBSERVATION таблицу в DELETE и подзапросе, вы можете использовать псевдоним таблицы и правильно упомянуть его в операторе DELETE.

В вашем сценарии будет работать следующий запрос:

DELETE OB
FROM OBSERVATION OB
WHERE OB.ID IN (
    SELECT SOB.ID 
    FROM OBSERVATION SOB
    INNER JOIN SPECIMEN SP ON SP.ID = SOB.SPECIMEN_ID
    WHERE SP.GENDER = "male" AND 
          SOB.VALUE_TERM IS NOT NULL AND 
          SOB.PARAMETER_STABLE_ID = "IMPC_PAT_028_002"
)
...