2013-06-07 5 views
2

У меня есть две таблицыВозвращение нескольких значений в одном столбце

Employee:

Empid Ename Eage Eadd Ephone 
1  x  23 b 677 
2  y  24 h 809 
3  z  34 u 799 

Департамент:

Did fkEmpid dname ddescription 
123 1  test test 
234 1  test1 test1 
667 2  hello hello 

Наконец, я хочу что-то вроде этого

Ename Eage Eadd Ephone dname 
x  23  b 677  test,test1 
y  24  h 809  hello 
z  34  u 799  null 

Пожалуйста, помогите мне с SQL

+3

что РСУБД ?? –

+7

Дубликат: <введите 1000 вопросов здесь> –

+2

1. Что такое ваша СУБД? 2. Каков ваш вопрос? 3. Покажите нам свою попытку, прежде чем вы ожидаете от нас помощи! –

ответ

0

Учитывая RDBMS в SQL SERVER 2008

select E.Ename,E.Eage,E.Eadd,E.Ephone,D.dname 
into Table1 
from Employee E 
left join Deparment D on E.Empid=D.fkEmpid 

select t1.[Ename], t1.[Eage], t1.[Eadd], t1.[Ephone], 
STUFF((
    SELECT ', ' + t2.dname 
    FROM Table1 t2 
    WHERE t2.Ename = t1.Ename 
     AND t2.Eage=t1.Eage 
     AND t2.Eadd=t1.Eadd 
     AND t2.Ephone=t1.Ephone 
    FOR XML PATH ('')) 
    ,1,2,'') AS Names 
FROM Table1 t1 
GROUP BY t1.Ename,t1.[Eage], t1.[Eadd], t1.[Ephone]; 

SQL FIDDLE

5

Это, конечно, было бы неплохо знать целевой СУБД. Но этот вопрос задается так часто, поэтому давайте попробуем и перечислим все (по крайней мере, популярные) бок о бок.

Для SQL Server:

SELECT e.Ename, e.Eage, e.Eadd, e.Ephone, d.dname 
    FROM Employee e LEFT JOIN 
(
    SELECT fkEmpid, 
     STUFF((SELECT ',' + dname 
        FROM Department 
        WHERE fkEmpid = t.fkEmpid 
        FOR XML PATH('')) , 1 , 1 , '') dname 
    FROM Department t 
    GROUP BY fkEmpid 
) d 
    ON e.Empid = d.fkEmpid 

Вот SQLFiddle демо

Для Mysql, SQLite, HSQLDB 2.X:

SELECT e.Ename, e.Eage, e.Eadd, e.Ephone, d.dname 
    FROM Employee e LEFT JOIN 
(
    SELECT fkEmpid, 
     GROUP_CONCAT(dname) dname 
    FROM Department t 
    GROUP BY fkEmpid 
) d 
    ON e.Empid = d.fkEmpid 

Вот SQLFiddle демо (MySql)
Вот SQLFiddle демо (SQLite)

Для Oracle 11g:

SELECT e.Ename, e.Eage, e.Eadd, e.Ephone, d.dname 
    FROM Employee e LEFT JOIN 
(
    SELECT fkEmpid, 
     LISTAGG (dname, ',') WITHIN GROUP (ORDER BY dname) dname 
    FROM Department t 
    GROUP BY fkEmpid 
) d 
    ON e.Empid = d.fkEmpid 

Вот SQLFiddle демо

Для PostgreSQL 9.X:

SELECT e.Ename, e.Eage, e.Eadd, e.Ephone, d.dname 
    FROM Employee e LEFT JOIN 
(
    SELECT fkEmpid, 
     string_agg(dname, ',') dname 
    FROM Department t 
    GROUP BY fkEmpid 
) d 
    ON e.Empid = d.fkEmpid 

Вот SQLFiddle демо

Выход во всех случаях:

| ENAME | EAGE | EADD | EPHONE |  DNAME | 
--------------------------------------------- 
|  x | 23 | b | 677 | test,test1 | 
|  y | 24 | h | 809 |  hello | 
|  z | 34 | u | 799 |  (null) | 
+0

HI Peterm Thnks для ответов .. и жаль, что я не знаю, что я скачал RDBMS .. Я использую HSQLDB –

+0

@ShivangiGupta - Похож, что 'GROUP_CONCAT' доступен для [версий> = 2] (http://stackoverflow.com/ Вопросы/16978291/return-multiple-values-in-one-column # comment24532063_16978291) –

+0

@ShivangiGupta Просто используйте MySql-версию запроса и дайте мне знать, помогли ли это. Он отлично работает на HSQLDB 2.2. – peterm