Я использую 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','%'));
но он берет навсегда и никогда не заканчивается.
Начните с квалификации всех имен столбцов. Это все еще вызывает ошибку?
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
запросы с такими подстановочными знаками крайне неэффективны. Часто вы можете структурировать модель данных, чтобы вы могли написать более эффективный запрос.
Вам не хватает ключевого слова 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
. Скорее всего, он выполняет много, намного хуже...
Я думаю, что вы опечалили второе предложение, и оно должно сказать:
SELECT DISTINCT 't2_name'
FROM 't2'
WHERE NOT EXISTS (SELECT * FROM 't1'
WHERE 't1_name' LIKE CONCAT('%','t2_name','%'));
На данный момент вы эффективно сравниваете t2_name с самим собой.
В любом случае, это будет весело, потому что mysql собирается выполнить сканирование таблицы. Взгляните на структуру данных и контент и посмотрите, лучше ли вам выполнять очистку или реструктуризацию данных, прежде чем пытаться использовать ее для анализа.