Двойное левое соединение на той же таблице для транспонирования - PullRequest
0 голосов
/ 07 ноября 2018

IBM iNavigator (или универсальный / независимый SQL):

Я работаю с системой IBM, которая сохраняет комментарии в виде 25-символьных текстовых блоков. Я пытаюсь собрать первые три сегмента текстовых блоков для каждого сохраненного комментария. Таблица комментариев имеет номер заголовка комментария (COMM_NO), порядковый номер строки (LINE_SQ) и фактический текст (TXT). Я смотрю на три примера комментариев. В комментарии № 1140 говорится: «Возврат продукта клиента после истечения срока гарантии. Требуется цитата». Комментарий № 1408 состоит из двух сегментов: «Попытка позвонить клиенту после обновления». Комментарий № 2884 является коротким и говорит только «RMA # 467». Данные таблицы выглядят так [РЕДАКТИРОВАТЬ: исправленный оператор вставки]:

CREATE TABLE mycomments
    ([COMM_NO] int, [LINE_SQ] int, [TXT] varchar(25))
;
INSERT INTO mycomments
    ([COMM_NO], [LINE_SQ], [TXT])
VALUES
    (1140, 1, 'Customer product return a'),
    (1140, 2, 'fter warranty expired. Ne'),
    (1140, 3, 'eds quote issued.'),
    (1408, 1, 'Tried to call customer af'),
    (1408, 2, 'ter update.'),
    (2884, 1, 'RMA #467');

И что мне нужно, это:

COMM_NO  TXT1                      TXT2                      TXT3
-------  ------------------------- ------------------------- ------------------------- 
1140     Customer product return a fter warranty expired. Ne eds quote issued.
1408     Tried to call customer af ter update.               {null} 
2884     RMA #467                  {null}                    {null}

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

SELECT 
  comm1.COMM_NO
, comm1.TXT as TXT1
, comm2.TXT as TXT2
, comm3.TXT as TXT3
  FROM mycomments comm1
  LEFT JOIN mycomments AS comm2 ON comm2.COMM_NO = comm1.COMM_NO AND comm1.LINE_SQ=1 AND comm2.LINE_SQ=2
  LEFT JOIN mycomments AS comm3 ON comm3.COMM_NO = comm1.COMM_NO AND comm1.LINE_SQ=1 AND comm2.LINE_SQ=2 AND comm3.LINE_SQ=3

На самом деле, мне бы очень хотелось объединить три сегмента вместе, даже если TXT3 или TXT2 / TXT3, приведенные выше, равны нулю:

COMM_NO  BIGTXT1
-------  --------------------------------------------------------------------------- 
1140     Customer product return after warranty expired. Needs quote issued.
1408     Tried to call customer after update.
2884     RMA #467

Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Прежде всего, отличная работа по предоставлению операторов DDL и INSERT. Основная проблема, с которой вы столкнулись, - это порядок столов в определении JOIN. Заказ имеет значение для OUTER соединений. Поскольку вы запускаете LEFT объединение против comm1, это всегда должно быть первым в вашем ON утверждении. Другими словами, вы говорите: «всегда дайте мне данные из comm1 и дайте мне все, что есть в моей объединенной таблице, если там есть данные». Поэтому я переписал это так:

SELECT 
  comm1.COMM_NO
, comm1.TXT as TXT1
, comm2.TXT as TXT2
, comm3.TXT as TXT3
  FROM mycomments comm1
  LEFT JOIN mycomments AS comm2 ON comm1.COMM_NO = comm2.COMM_NO AND comm2.LINE_SQ=2
  LEFT JOIN mycomments AS comm3 ON comm1.COMM_NO = comm3.COMM_NO AND comm3.LINE_SQ=3
  WHERE comm1.LINE_SQ = 1

Примечание. Я также добавил критерий comm1.LINE_SQ = 1 в предложение WHERE, чтобы вам не пришлось повторять его в JOIN. Я проверил, используя предоставленный DDL, и он работает как положено.

Если вы хотите в одном большом столбце, вы можете сделать что-то подобное для своего SELECT утверждения:

comm1.TXT + CASE WHEN comm2.TXT IS NOT NULL THEN comm2.TXT ELSE '' END + CASE WHEN comm3.TXT IS NOT NULL THEN comm3.TXT ELSE '' END BIGTXT1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...