mysql Код ошибки: 1066. Не уникальная таблица / псевдоним: 't2'

0

Я использую mysql workbench и mysql server для запроса базы данных. У меня есть две таблицы t1 и t2 с одним столбцом t1_name и t2_name. t2 имеет 3 миллиона записей, а t1 - 1 миллион.

Мне нужно выбрать все t2_names где t2_names не равно t1_name или не подстрока t1_name. Когда я попробую выполнить запрос ниже:

SELECT DISTINCT 't2_name'
FROM 't2', 't1'
't2'.'t2_name' NOT LIKE CONCAT('%','t1'.'t1_name','%'));

Я получаю эту ошибку:

mysql Код ошибки: 1066. Не уникальная таблица/псевдоним: 't2'

Можете ли вы объяснить и исправить мой запрос, пожалуйста? Ранее я сделал это сообщение и попробовал этот запрос:

SELECT DISTINCT 't2_name'
FROM 't2'
WHERE NOT EXISTS (SELECT * FROM 't1'
                    WHERE 't2_name' LIKE CONCAT('%','t2_name','%'));

но он берет навсегда и никогда не заканчивается.

Теги:
mysql-workbench

3 ответа

0

Начните с квалификации всех имен столбцов. Это все еще вызывает ошибку?

SELECT DISTINCT t2.t2_name
FROM t2 JOIN
     t1
     ON t2.t2_name NOT LIKE CONCAT('%', t1.t1_name, '%');

Если ваша проблема - это производительность, она not exists будет лучше, если не будет distinct:

SELECT t2_name
FROM t2
WHERE NOT EXISTS (SELECT 1
                  FROM t1
                  WHERE t2.t2_name LIKE CONCAT('%', t1.t1_name, '%')
                 );

Однако это не будет большим улучшением. К сожалению, like запросы с такими подстановочными знаками крайне неэффективны. Часто вы можете структурировать модель данных, чтобы вы могли написать более эффективный запрос.

0

Вам не хватает ключевого слова WHERE. Парсер считает, что t2 должен быть псевдонимом для t1 как следует t1. Но t2 уже занято предыдущим t2.

Вставьте WHERE (и удалите последнее закрытие )):

SELECT DISTINCT 't2_name'
FROM 't2', 't1'
WHERE 't2'.'t2_name' NOT LIKE CONCAT('%','t1'.'t1_name','%');

Боковое замечание: я боюсь, что ваша попытка построить картезианский продукт не будет лучше, чем NOT EXISTS. Скорее всего, он выполняет много, намного хуже...

0

Я думаю, что вы опечалили второе предложение, и оно должно сказать:

SELECT DISTINCT 't2_name'
FROM 't2'
WHERE NOT EXISTS (SELECT * FROM 't1'
                    WHERE 't1_name' LIKE CONCAT('%','t2_name','%'));

На данный момент вы эффективно сравниваете t2_name с самим собой.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню