SQL объединение по умолчанию в предложении? - PullRequest
0 голосов
/ 26 мая 2020

Когда я объединяю две таблицы с помощью объединения, я заметил, что порядок не такой, как я ожидал.

Calculus_class

Kevin   Le      kevinle892@email.edu
Jackie  Chan    jchan@email.edu
Sam     Smit    ssmitten@email.edu

stats_class

Kay     Lam     klam204@email.edu
Jackie  Chan    jchan@email.edu
Pooja   Pri     ppriyanka@email.edu

Когда я объединяю две таблицы выше

select * from calculus_class
union 
select * from stats_class 

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

Kevin   Le      kevinle892@email.edu
Jackie  Chan    jchan@email.edu
Sam     Smit    ssmitten@email.edu
Kay     Lam     klam204@email.edu
Jackie  Chan    jchan@email.edu
Pooja   Pri     ppriyanka@email.edu

Это результат, который я получил с помощью DBeaver PostgreSQL:

Kevin   Le      kevinle892@uci.edu
Pooja   Pri     ppriyanka@uci.edu
Jackie  Chan    jchan473@uci.edu
Sam     Smit    ssmitten@uci.edu
Kay     Lam     klam204@uci.edu

Ответы [ 3 ]

3 голосов
/ 26 мая 2020

На самом деле вы используете union, который удаляет дубликаты, но вы не хотите дублировать удаление. Так что просто используйте union all:

select * from calculus_class
union all
select * from stats_class;

Если вы действительно хотите упорядочить результаты, вам нужно помнить, что SQL таблицы и наборы результатов представляют неупорядоченные наборы. Если вы хотите, чтобы результаты были упорядочены чем-то, вы можете добавить order by:

select * from calculus_class
union all
select * from stats_class
order by fname;

Здесь - это скрипт db <>.

2 голосов
/ 26 мая 2020

Кажется, вы предполагаете, что строки таблицы имеют внутренний порядок. Это не вариант. Таблицы представляют собой режим неупорядоченных наборов строк , нет никакого порядка по умолчанию.

Если вы не добавите в свой запрос предложение order by, порядок, в котором будут возвращаться строки, не определен: база данных может возвращать строки в любом порядке - это может или не может, быть последовательным при последовательном выполнении одного и того же запроса. То же самое касается строк, возвращаемых запросом union (который фактически создает производную таблицу).

Итак, если вы хотите упорядочить, используйте предложение order by: это неясно какой столбец следует использовать, поэтому я помещаю в запрос ?.

select *
from (
    select * from calculus_class
    union all
    select * from stats_class
) t
order by  ?

Если вам сначала нужны строки из первой таблицы, вы можете сделать:

select *
from (
    select 1 rn, c.* from calculus_class c
    union all
    select 2 rn, s.* from stats_class
) t
order by  rn

Обратите внимание, что я изменено union на union all: если вы не хотите удалять дубликаты в двух таблицах (что является целью union), union all более эффективен, и его следует использовать всегда.

0 голосов
/ 26 мая 2020

Вложенный запрос не требуется:

выберите 1 ряд, c. * From Calculus_class c объедините все выберите 2 числа, s. * Из stats_class в порядке 1

...