2017-10-22 22 views
0

論理的に1対多のテーブルが2つあります。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 

は、残念ながら、これはとその隣EX用のリストいったんすべての人を表示することである、私が行うには考えているものではありません。:

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 Serverの最新バージョン(2017 SQL Serverの)最終的にこの機能を持つ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を使用しています。 –

関連する問題