2017-10-22 7 views
0

논리적으로는 1 대 다수의 두 테이블이 있습니다.SQL Server : 1 대 다수 선택 쿼리

첫 번째 테이블 :

CREATE TABLE Persons 
(
    ID int NOT NULL PRIMARY KEY, 
    LastName varchar(255) NOT NULL, 
    FirstName varchar(255), 
    Age int 
); 

두 번째 테이블 :

CREATE TABLE Vehicles 
(
    Brand varchar(50), 
    PersonID int, 

    FOREIGN KEY(PersonID) REFERENCES Persons(ID) 
); 

내 접근 방식은 사람과이 사람이 소유 차량의 각을 나열하는 것입니다.

나는 어떻게 관리 무엇 :

SELECT LastName, brand 
FROM vehicles 
INNER JOIN Persons ON Persons.ID = PersonID 
ORDER BY LastName ASC 

을 불행하게도 이것이 내가 예에 대한 차량의 목록은 모든을 표시 번 사람 과 옆에 할 수있는 마음에있는 것이 아니다 :

User1 | kia, ford, jeep 
User2 | ferrari, harley 

그렇다면 적절한 방법은 무엇입니까? 어떤 도움도 환영합니다!

답변

3

이에 대한 SUFFFOR XML를 사용할 수 있습니다

SELECT FirstName, LastName, 
STUFF((
    SELECT ', ' + v.Brand 
    FROM vehicles as v 
    WHERE v.PersonID = p.ID 
    FOR XML PATH ('')) 
    ,1,2,'') AS Vehicles 
FROM Persons AS p; 

결과 :

| FirstName | LastName |  Vehicles | 
|-----------|----------|-----------------| 
|  User1 | user1 | Ford, kia, jeep | 
|  User2 | User2 | ferrri, harley | 
+0

@GordonLinoff 감사합니다. 네 말이 맞습니다. –

+0

고마워요, 잘 작동합니다. 차량이없는 사람을 제외시키기 위해 어떻게 업데이트 할 수 있습니까? 왜냐하면 지금까지 나는 차량에 (차량을 소유하지 않은 경우) 모든 사람을 영주권으로 취급하고 있기 때문입니다. 감사합니다. –

2

SQL 서버의 최신 버전 (2017 SQL 서버) 마지막으로이 기능을 가지고있다. ilt-in. 그래서 당신은 할 수 있습니다 :

SELECT p.LastName, 
     STRING_AGG(v.brand, ', ') WITHIN GROUP (ORDER BY v.brand) as vehicles 
FROM Persons p JOIN 
    vehicles v 
    ON p.ID = v.PersonID 
GROUP BY p.ID, p.LastName; 

을 하나 개 이상의 테이블 쿼리가있을 때, 나는 당신이 항상 테이블 별칭과 자격을 갖춘 열 이름을 사용하도록 권합니다.

차량이없는 사람들을 포함 시키려면 LEFT JOIN을 사용하십시오.

+0

감사하지만 불행히도 SQL Server의 이전 버전을 사용하고 있습니다. –