SQL-запрос для выбора одной из нескольких строк из таблицы

У меня есть таблица, которая содержит более одной строки для определенного значения. Вот структура таблицы:

NAME,NUMBER,STATUS,DESC,START_DATE,END_DATE
A,3,X,DetailsOfX,13-10-15,13-10-15
A,2,Y,DetailsOfY,13-10-15,13-10-15
A,2,Z,DetailsOfZ,13-10-15,13-10-15
A,1,X,DetailsOfX,12-10-15,12-10-15

Мне нужен вывод, т.е.

A,3,X,DetailsOfX,13-10-15,13-10-15
A,2,Y,DetailsOfY-DetailsofZ,13-10-15,13-10-15
A,1,X,DetailsOfX,12-10-15,12-10-15

Итак, в основном я хочу выбрать одну из двух или более строк из таблицы с данными из столбцов из обеих строк (выделено жирным шрифтом выше). Запрос ниже, который я пробовал с помощью JOIN, возвращает 4 строки.

SELECT A.NAME,A.NUMBER,B.STATUS,A.DESC||"-"||B.DESC,A.START_DATE,A.END_DATE
FROM TABLE A
JOIN (SELECT NUMBER,STATUS,DESC,START_DATE,END_DATE FROM TABLE WHERE NAME='A') B
ON A.NAME=B.NAME AND
A.NUMBER=B.NUMBER

Может кто-нибудь помочь мне с запросом, который будет работать.

Спасибо


person Ninja    schedule 15.10.2013    source источник
comment
Это будет сильно различаться в зависимости от используемой СУБД.   -  person Lamak    schedule 15.10.2013
comment
Я не думаю, что в этом случае вам понадобится JOIN.   -  person hjpotter92    schedule 15.10.2013
comment
Это AS400 на бэкэнде   -  person Ninja    schedule 15.10.2013
comment
Вы, вероятно, захотите добавить AND A.STATUS <> B.STATUS, иначе вы просто будете соединять строки сами по себе и в итоге получите DetailsOfY-DetailsOfY   -  person Marc B    schedule 15.10.2013
comment
В таблице гораздо больше строк для ИМЕН, отличных от A. Добавление этого условия ‹› опускает все остальные строки и по-прежнему дает мне 2 строки, из которых одна именно та, которую я хочу.   -  person Ninja    schedule 15.10.2013


Ответы (2)


Если вы используете IBM i 7.1 (ранее известную как OS/400), вы сможете сделать это с помощью двух приемов: иерархические запросы и функции XML.

См. мой учебник в разделе Q: Объединение строк SQL, в котором объясняется, как это сделать в DB2 for i для объединения описаний.

GROUP BY любые поля, по которым вы хотели бы объединить строки в одну, но все остальные столбцы должны быть результатом агрегатной функции. Так, например, если вам нужна одна строка для имени, номера, но разные значения для Status, StartDate, EndDate, вам нужно будет сказать что-то вроде min(Status), min(StartDate), max(EndDate). Является ли минимальный код состояния тем, о котором вы хотите сообщить?

Если ваша ОС версии 6.1, вы по-прежнему можете использовать обычный рекурсивный запрос (или под v5r4), но вам может понадобиться дополнительный CTE (или два?) для объединения описаний.

person WarrenT    schedule 15.10.2013

Вам нужно использовать GROUP BY и FOR XML PATH:

SELECT 
  X.NAME, X.NUMBER, X.STATUS,
  STUFF((
    SELECT '-' + [Desc] AS Desc 
    FROM YourTable Y
    WHERE Y.ID = X.ID
    FOR XML PATH(''),TYPE),1,1,'') AS DescValues,
  StartDate,
  EndDate
FROM YourTable X
GROUP BY Name, Number, Status, StartDate, EndDate

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

Кроме того, это предполагает SQL Server.

person mayabelle    schedule 15.10.2013
comment
У меня есть AS400 на сервере. Не уверен, что это поможет. Спасибо. - person Ninja; 15.10.2013
comment
Нет, это не будет работать в DB2 для i. Наш синтаксис и наша поддержка XML отличаются. (В SQL Server разве ваш запрос не ставит дефис перед каждым описанием, независимо от того, объединено оно или нет?) - person WarrenT; 16.10.2013