2014-11-18 2 views
0

Итак, я новичок в производных таблицах. Когда я запускаю этот запрос, он дает мне MYSQL ERROR 1248. Кто-нибудь знает об этом? Это, наверное, самый сложный запрос, который я сделал, и я просто хочу заставить его работать. Спасибо!MYSQL ERROR 1248 Я застрял

delete from table_1 
    where thing_id in (
     select tid from(
      select thing_id as tid 
      FROM table_1 
      inner join table_2 
      on table_1.thing_id = table_2.thing_id 
      where stuff = 'stuff' 
      ) 
     ) 

ответ

2

Вы забыли псевдоним таблицы (ов)

delete from table_1 
where thing_id in (
    select tid from(
     select table_1.thing_id as tid 
     FROM table_1 
     inner join table_2 
     on table_1.thing_id = table_2.thing_id 
     where table_1.stuff = 'stuff' 
     ) tmp 
    ) 
3

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

delete t1 
    from table_1 t1 join 
     (select t1.thing_id as tid 
      from table_1 t1 inner join 
       table_2 t2 
       on t1.thing_id = t2.thing_id 
      where stuff = 'stuff' 
     ) tt 
     on t1.thing_id = tt.tid; 

То есть, я думаю это эквивалентно просто делать join на table2:

delete t1 
    from table_1 t1 join 
     table_2 t2 
     on t1.thing_id = t2.thing_id; 
    where stuff = 'stuff'; 

Последняя метод должен иметь лучшую производительность.

+0

Зловонный нижний уровень? Или была причина для этого? –

+0

Злоумышленник? Нет. Озорник? Да ;-) Первая часть этого не имеет отношения к проблеме. Тем не менее, вторая часть выглядит на месте! – Strawberry

+0

@Strawberry. , , Я бы сказал, что использование неподдерживаемого синтаксиса в базе данных * очень * относится к проблеме. Возможно, не нужно специально выполнять синтаксическую ошибку, но OP это исправит, а затем получит еще одну ошибку. Мне кажется вредоносным, если это аргументация, потому что первым решением является правильная переписывание запроса (хотя в конкретном коде могут быть синтаксические ошибки). –

Смежные вопросы