2017-05-22 3 views
-2

Ich habe drei Tabellen Land, Staat und StadtSortieren SQL-Abfrageergebnis und concantenate

enter image description here

ich die Ergebnisse müssen im Format

Land sein | * Alle Länder gehören zum Land, getrennt durch ',' * | die ganze Stadt gehört dem Land getrennt ‚‘

Auch die Staaten sollten keine Duplikate haben. für zB:

Badakhshan, Badakhshan, Badakhshan, Badakhshan, Badakhshan, Badgis, Badgis

nicht auftreten sollte.

schrieb ich eine Abfrage, um die Liste

with aggregatelist(countryname,statename,cityname) as 
(select c.name as countryname,s.name as statename,ct.name as cityname from countrymaster c inner join statemaster s on 
    c.id=s.countryid inner join citymaster ct on ct.stateid=s.id group by c.name,s.name,ct.name 
) 

Aber das wird nicht wieder das gewünschte Format zu holen.

Wie kann ich das ohne eine temporäre Tabelle tun?

+2

Sie zu viel Ruf nicht wissen [fragen] . –

Antwort

2

Verwenden Stuff und FOR XML Pfad group concat

SELECT co.[Name], 
    STUFF(
    (
    SELECT ',' + st.[Name] 
    FROM State st 
    WHERE co.Id = st.CountryId 
    FOR XML PATH('') 
    ), 1, 1, '') As States, 
    STUFF(
    (
    SELECT ',' + ci.[Name] 
    FROM State st 
    INNER JOIN City ci ON st.Id = ci.StateId 
    WHERE co.Id = st.CountryId 
    FOR XML PATH('') 
    ), 1, 1, '') As cities 
FROM Country co 
+0

Gibt es einen Grund, warum dies abgelehnt wurde? –

+1

Ich brauche das Ergebnis zu verketten und dies hat in der Frage auch erwähnt. – user1357872

+0

Ich habe vor diesem Schnitt geantwortet ... Ich werde meine Antwort entsprechend bearbeiten. –

2

zu stimulieren, wenn Sie drei Tabellen wie unten, dann sollten SQL wie folgt aussehen:

create table city (id number, name varchar2(1000),state number); 
create table state (id number, name varchar2(1000),country number); 
create table ctry (id number, name varchar2(1000),cc varchar2(10)); 

then SQL should look like: 

SELECT a.name 
     ,a.states 
     ,b.cities 
    FROM (SELECT c.id 
       ,c.name 
       ,listagg(s.name, ',') within GROUP(ORDER BY s.id) states 
      FROM state s 
      JOIN ctry c 
      ON s.country = c.id 
     GROUP BY c.id, c.name) a 
RIGHT JOIN (SELECT s.name 
        ,s.country 
        ,listagg(c.name, ',') within GROUP(ORDER BY c.id) cities 
       FROM state s 
       JOIN city c 
       ON s.id = c.state 
       GROUP BY s.name 
         ,s.country) b 
    ON a.id = b.country