2012-06-01 2 views
0

я не могу показаться, чтобы получить SQL работать при использовании LIKEУдалить строки с помощью Sub Query?

DELETE FROM `customer_numbers` 
WHERE number NOT LIKE (SELECT number FROM number_part)% 

В основном удалить все строки из таблицы, если constomer_numbersnumber не содержит в number_part таблице

Пример: customer_numbers.number = 0559354544 и number_part.number = 05593 - его не следует удалять .. Однако если 05593 не содержит в customer_numbers.number, тогда удалите строку из таблицы customer_numbers. Она должна соответствовать первым 5 цифрам от number_part

ответ

2

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

Вместо этого, вы можете использовать связанный подзапрос:

DELETE FROM `customer_numbers` 
WHERE not exists (SELECT number FROM number_part 
        where customer_numbers.number like concat(number, '%') 
       ) 
+0

Если 'customer_numbers.number' = 0559354544 и' number_part.number' = 05593 - оно не должно удалите его. Однако если 05593 не содержит в 0559354544, то удалите номер из таблицы customer_numbers. Он должен соответствовать первым 5 цифрам из 'number_part.number' –

+0

Внутренний подзапрос вернет число, когда будет совпадение. «Не существует» не позволит этому обновить. Разве это не то, чего вы хотите? –

0
  1. Вы не можете делать LIKE в цифровом поле.
  2. Вы не можете сделать равенство в подвыборке, который не является ОТСУТСТВУЕТ.

Вы должны использовать «IN».

DELETE FROM `customer_numbers` WHERE number NOT IN (SELECT number FROM number_part) 
0

Как о чем-то вроде этого:

DELETE FROM customer_numbers WHERE number NOT IN (SELECT number FROM number_part) 
1

Ваш запрос является довольно сломана. По крайней мере двумя способами:

  1. Ваш подзапрос возвращает несколько строк, но находится в месте, где похоже, что вы ожидаете одного результата.

  2. Вам нужна ваша строка LIKE для цитирования.

2, вероятно, легко исправить. Попытка:

... WHERE number LIKE CONCAT((SELECT ... LIMIT 1),'%'); 

1 действительно является вашей проблемой. Если вы запустите свой подзаголовок как одну команду, я ожидаю, что вы получите несколько строк, не так ли? Как вы ожидаете рассматривать список чисел (допустим, 1, 2, 3, 4, 5) как часть строки LIKE?

Что я предполагаю, вы надеетесь, что-то вроде LIKE '1%' OR LIKE '2%' OR LIKE '3%'... и т. Д. Нет?

Во всяком случае, если вы можете более точно уточнить, что вы пытаетесь сделать, мы, вероятно, можем помочь вам решить вашу проблему лучше.

Как ваш вопрос сформулирован, все, что я могу сказать: Это не работает.

+0

Спасибо за подробный ответ .. В таблице 'number_part' содержится около 100 строк (' number' может выглядеть примерно так: 1200, 1300, 1666 и т. Д.). В таблице 'customer_numbers' номер может выглядеть так: 15343443455. Если номер 1200, 1300, 1666 не содержится в 15343443455, то удалите его. –

+0

MySQL использует 'CONCAT' функцию, поэтому' CONCAT ((SELECT ... LIMIT 1), '%') ' – GarethD

+0

@GarethD: Спасибо, ответьте обновлен. – Flimzy

1

Вы назвали номера полей, но они кажутся символьными значениями из-за ведущих 0, поэтому я собираюсь предположить, что они являются полями символов.

Если номер детали всегда будет 5 символов, то вы можете сделать следующее:

DELETE FROM `customer_numbers` 
WHERE substring(number,1,5) NOT IN (SELECT number FROM number_part)