2010-08-26 2 views
5

У меня есть таблица базы данных с данными, как показано ниже:SqL выберите запрос помощь

Primary key | Column1  | Column2   | col3 | col4 |col5 
--------------------------------------------------------------------- 

1   | Chicago Bulls | Michael Jordan | 6'6 | aaaa | cccc 

2   | Chicago Bulls | Scottie Pippen | 6'8 | zzzz | 345 

3   | Utah Jazz  | Malone   | 6'9 | vvvv | xcxc 

4   | Orlando Magic | Hardaway   | 6'7 | xnnn | sdsd 

Я хочу написать запрос, который закачает все различные значения в COLUMN1 и добавляемое значение в COLUMN2 для каждого значения COLUMN1. Для например: запрос должен возвращать

**Chicago Bulls | Michael Jordan, Scottie Pippen** 

**Utah Jazz  | Malone** 

**Orlando Magic | Hardaway** 

я могу написать запрос для выборки всех различных значений в column1, то перебирать каждое определенное значение, чтобы получить прилагаемый столбец 2, после некоторых манипуляций. Возможно ли выполнить всю работу только в одном запросе? Пожалуйста, помогите с примером запроса. Спасибо.

+0

Какие DMBS вы используете? –

+0

На самом деле существует довольно широкий набор подходов для решения этой проблемы в разных СУБД здесь - возможный дубликат [Как создать список с разделителями-запятыми с использованием SQL-запроса?] (Http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separate-list-using-a-sql-query) –

+0

Я использую java derby ... – Fishinastorm

ответ

5

Если вы используете MySQL

select Column1, group_concat(Column2) 
from t 
group by Column1  
+0

Это не дает ОП конечный результат, который он ищет. – Dutchie432

+0

@ Dutchie - Почему бы и нет? Похоже на меня. –

+0

Знаете что? Я неправильно прочитал ваше решение. Точнее пропустил «group_concat» ... Голос с правом голоса изменился на голосование. Виноват. – Dutchie432

2

Если вы используете SQL Server:

SELECT Column1, 
stuff((
    SELECT ', ' + Column2 
    FROM tableName as t1 
    where t1.Column1 = t2.Column1 
    FOR XML PATH('') 
    ), 1, 2, '') 
FROM tableName as t2 
GROUP BY Column1 

Не знаю, почему Microsoft делает этот так сильно, но, насколько я знаю, это единственный метод для этого в SQL Server ...

На боковой ноте вы можете рассмотреть возможность изменения столбца 1 в таблице поиска или в следующий раз, когда Юта движется, вы будете ненавидеть жизнь;)

+0

+1 Я думаю, что это лучший метод в SQL Server, есть [другие возможности] (http://www.projectdmx.com/tsql/rowconcatenate.aspx), хотя они не так эффективны и не гарантируют порядок. Также вы можете увидеть [здесь] (http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/07/06/871.aspx), чтобы остановить его, ускользая от специальных символов XML. –

+1

Диктор: «И играть стрельба для Чикагских быков у нас есть > & <, ранее известный как Майкл Джордан !!! " (толпа сходит с ума) –

0

Общее решение этой проблемы представляет собой совокупную функцию ARRAY_AGG(), которая возвращает массив, содержащий значения в разных строках, необязательно упорядоченные по некоторым критериям. Эта функция была предложена для следующей версии стандарта SQL. Функция GROUP_CONCAT() - это особый случай, который преобразует массив в строку, разделенную запятой.

И ARRAY_AGG(), и GROUP_CONCAT() поддерживаются последним HSQLDB 2.0.1. http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#N12312

+0

Из комментариев выяснилось, что OP фактически использует «java derby» –

+0

Сообщение не упоминало об этом. У Derby нет этой возможности. Поэтому ответы могут помочь ему выбрать альтернативу, если он захочет. – fredt

0

SQL Anywhere имеет функцию list() aggregation, так как более десяти лет именно для этой цели.

Если вы используете SQL Server, то помимо сложного решения, которое в некоторой степени злоупотребляет XML, вы можете написать свою собственную функцию агрегации на любом языке .net. И Microsoft documentation of this feature использует пример случайной конкатенации в качестве примера.

+0

Из комментариев выяснилось, что OP фактически использует «java derby» –

+0

О, у меня был sql-сервер как тег, когда я написал свой ответ. – Frank