Создание списка из 2 таблиц с условиями, используя только 1 оператор

#mysql

#mysql

Вопрос:

Я создал 2 таблицы A и B, как показано ниже :

  A                  B
Name              Name
Burger          Avocado
Beef              Crab
Potato.           Pizza
 

Я хочу создать список, который возвращает имена в 2 таблицах, длина которых> 5, используя только 1 оператор.

Мой код :

     SELECT A.Name,B.Name
    INTO LIST
    FROM A,B
    WHERE LENGTH(A.Name)>5 AND LENGTH(B.Name)>5;
 

Ошибка: список необъявленных переменных.

Мой вопрос в том, как я могу объявить СПИСОК, но по-прежнему использовать только 1 оператор для этого вопроса.

Спасибо

Ответ №1:

MySQL не поддерживает SELECT INTO . Если список таблиц уже создан, я думаю, что вам нужно:

 INSERT INTO LIST
SELECT Name FROM A WHERE LENGTH(Name) > 5
UNION
SELECT Name FROM B WHERE LENGTH(Name) > 5;
 

Если список таблиц еще не существует, вы могли бы сделать:

 CREATE TABLE LIST
AS
SELECT Name FROM A WHERE LENGTH(Name) > 5
UNION
SELECT Name FROM B WHERE LENGTH(Name) > 5;
 

Комментарии:

1. Спасибо Рабат. В любом случае мы можем получить список только в 1 операторе? Я думаю, что Create и Select — это 2 оператора. Этот вопрос взят из моего экзамена, в котором запрашивается код только в 1 операторе. Спасибо

2. SELECT DISTINCT on data set selected by UNION это неправильный путь.

3. @Spoonfed Если вам нужен только список, и его не нужно материализовывать в таблицу, просто используйте часть запроса select . Имеет ли это смысл?

4. На самом деле ОБЪЕДИНЕНИЕ по умолчанию выполняется DISTINCT . ОБЪЕДИНЕНИЕ ALL — это тот, который этого не делает. Я обновил, чтобы упростить запрос.

Ответ №2:

Вы можете попробовать выполнить этот запрос:

 CREATE TEMPORARY TABLE LIST
SELECT Name FROM A WHERE LENGTH(Name) > 5
UNION
SELECT Name FROM B WHERE LENGTH(Name) > 5
;
 

Этот запрос создаст временную таблицу LIST из результата, полученного от запроса.

Если у вас уже есть таблица LIST и вам нужно вставить данные в таблицу — запустите следующий запрос:

 INSERT INTO LIST
SELECT Name FROM A WHERE LENGTH(Name) > 5
UNION
SELECT Name FROM B WHERE LENGTH(Name) > 5
;
 

КСТАТИ

возвращает имена в 2 таблицах, длина которых> 5

для этого вы должны использовать UNION , иначе ваш результат будет выглядеть так:

 SELECT A.Name, B.Name
FROM A,B
WHERE LENGTH(A.Name)>5 AND LENGTH(B.Name)>5;
 -------- --------- 
| Name   | Name    |
 -------- --------- 
| Burger | Avocado |
| Potato | Avocado |
 -------- --------- 
 

Но, похоже, вам нужно что-то вроде:

 select * from LIST;
 --------- 
| Name    |
 --------- 
| Burger  |
| Potato  |
| Avocado |
 --------- 
 

Комментарии:

1. Спасибо Владимир! Можем ли мы в любом случае вернуть такой список только в 1 операторе? Поскольку в моем экзаменационном вопросе запрашивается только 1 оператор, но кажется, что Create и Select — это 2 оператора.

2. В случае, если у вас уже есть таблица LIST , которую вам нужно запустить INSERT INTO LIST SELECT ... , я обновил свой ответ, чтобы вы могли видеть весь запрос.