Firebird - Смешайте записи двух разных таблиц - PullRequest
0 голосов
/ 11 сентября 2011

Я ищу способ решить мою проблему с sql.

У меня есть 2 таблицы в Firebird 2.5 (T1 и T2), подобные этим:

T1 (
 T1_ID INTEGER,
 T1_DAY DATE,
 T1_NAME VARCHAR(200)
)

T2 (
 T2_ID INTEGER,
 T2_DAY DATE,
 T2_NAME VARCHAR(200)
)

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

выход, например

T1_ID   T1_DAY   T1_NAME T2_ID   T2_DAY   T2_NAME
---------------------------------------------------
  1   01/02/2011  BOB     NULL    NULL     NULL
  2   27/02/2011  SAM     NULL    NULL     NULL
 NULL    NULL     NULL     8   15/03/2011  PETER
 NULL    NULL     NULL     10  21/03/2011  JOHN
  6   17/04/2011  AMY     NULL    NULL     NULL

или (лучше вывод)

 ID       DAY     NAME
-------------------------
  1   01/02/2011  BOB
  2   27/02/2011  SAM
  8   15/03/2011  PETER
  10  21/03/2011  JOHN
  6   17/04/2011  AMY

Как мой первый пост на stackoverflow.com (даже если я следил за ним в прошлом), я хочу поблагодарить вас за любой ответ на мой вопрос и поблагодарить всех вас за создание и помощь этому прекрасному сообществу!

С наилучшими пожеланиями

Francesco

1 Ответ

1 голос
/ 11 сентября 2011

Требуется оператор UNION:

SELECT
   T1.T1_ID ID,
   T1.T1_DAY DAY,
   T1.T1_NAME NAME
FROM
   T1

UNION
SELECT
    T2.T2_ID,
    T2.T2_DAY
    T2.T2_NAME
FROM
    T2
;

Вы можете сделать так, чтобы отдельные варианты выбора имели любые дополнительные функции, которые вам нравятся.Единственным ограничением является то, что все столбцы в обоих списках выбора расположены в одном и том же порядке и имеют одинаковый тип (они «совместимы с объединением»).Результирующие строки будут иметь заголовки столбцов, такие как первый выбор.

edit: Чтобы управлять порядком объединения, вам нужно будет выполнить объединение в подвыборке и упорядочение ввнешний запрос.

SELECT u.ID, u.DAY, u.NAME
FROM (
    SELECT T1.T1_ID ID, T1.T1_DAY DAY, T1.T1_NAME NAME
    FROM T1

    UNION
    SELECT T2.T2_ID, T2.T2_DAY T2.T2_NAME
    FROM T2
) u
ORDER BY u.NAME;
...