СОЮЗ неожиданные результаты? - PullRequest
0 голосов
/ 15 апреля 2019

Допустим, у нас есть:

Таблица 1

a (int) | b (int)
--------|--------
1       | 4
2       | 4

Таблица 2

c (text)   d (text) 
---------|---------
hoi      | hi

Запрос:

SELECT * FROM table1 
UNION 
SELECT * FROM table2 

1012 * выходы *

a     | b 
------|--------
1     | 4
2     | 4
hoi   | hi

По крайней мере, из запроса, который я только что запустил на mysql

Я бы ожидал (1, 4, NULL, NULL). Почему это не дает ошибку?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

UNION просто добавляет строки одного запроса к строкам другого.Пока два запроса возвращают одинаковое количество столбцов, ошибки нет.Имена столбцов всегда берутся из первого запроса.Если типы данных различаются, он находит общий тип, в который они все могут быть преобразованы;в вашем примере он преобразует столбцы int в text (MySQL об этом не знает, некоторые другие базы данных требуют, чтобы вы использовали явные вызовы CAST(), чтобы привести все к одному типу).

, так каккаждый ваш запрос возвращает два столбца, результат содержит два столбца, используя имена столбцов из table1.

0 голосов
/ 15 апреля 2019

Это немного длинно для комментария.

Я только что проверил это на MySQL 8.0 и SQLite, и он возвращает:

a   b
1   4
2   4
hoi hi

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

SQL Server и Postgres выдают ожидаемые ошибки - ошибки преобразования типов, приводящие к сбою запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...