2017-02-17 8 views
1

私は弊社を退去した人からSQLスクリプトを継承しました。このコードでStuff関数とFor XML Pathがどのように機能するかの説明が必要

最初の部分は、ユーザー名とその場所を選択し、一時テーブル#Rosterにデータを置く:

LastName FirstName Location 
    Smith  John  Tampa Hospital 
    Kennedy Tom  Maine Hospital 
    Smith  John  Orlando Hospital 

私はデータセットを見てみると第二部は、この

SELECT DISTINCT lastname, firstname, 
STUFF((SELECT DISTINCT ',' + r1.location 
from #Roster r2 
where r1.lastname = r2.lastname 
and r1.firstname = r2.firstname 
FOR XML PATH('')), 1, 1, '') 
FROM #Roster as r1 

のように見えますSTUFF関数を使用するSelectから、コードの最初の部分との違いはありません。ただし、データは名前と場所によって順序付けされています。

STUFFとFOR XML PATH()を使用してこのスクリプトの第2部分が必要な理由は誰でも知ることができますか?

ありがとうございました。

+0

私はそれを読んでスレッドが目的を説明していない私のスクリプトのコードの。あなたが参照しているスレッドは、出力を "aaa、bbb、ccc"と表示します。これは私のスクリプトでは起こっていません。 STUFF機能がここで使われている理由はわかりません。 – jackstraw22

+0

これは誤ってコーディングされているためです。サブクエリでDISTINCTを使用すると、コンマ区切りのリストが生成されません。 –

+0

@SeanLange私は、 'r2.location'ではなく' r1.location'が 'distinct'を使用しているのではないと言います。 http://rextester.com/TRNL18297 - あなたは正しいです、それは間違ってコード化されています。 – SqlZim

答えて

0

なぜこのDISTINCTが1回ではなく2回あるのかわかりません。このタイプのクエリのポイントは、グループの関連値の区切りリストを生成することです。あなたの場合は、それぞれの人のための場所になります。しかし、別個のものといくつかの他のものが、これを期待どおりに動作させていない。

ここで推測するが、あなたのクエリはこのようなものでなければならないと思う。

SELECT lastname 
    , firstname 
    , STUFF((SELECT ',' + location 
    from #Roster r2 
    where r1.lastname = r2.lastname 
     and r1.firstname = r2.firstname 
    FOR XML PATH('')), 1, 1, '') 
FROM #Roster as r1 
group by r1.lastname 
    , r1.firstname 
0

r1.locationr2.locationに場所を変更すると、あなたが期待する文字列の連結を提供します。

エイリアスを変更して、質問のコードのような数字を使用しないようにしました。

create table t (LastName varchar(32), FirstName varchar(32), Location varchar(32)) 
insert into t values 
('Smith','John','Tampa Hospital') 
,('Kennedy','Tom','Maine Hospital') 
,('Smith','John','Orlando Hospital') 

select distinct lastname, firstname 
, Location= stuff((select distinct ',' + i.location 
    from t as i 
    where t.lastname = i.lastname 
     and t.firstname = i.firstname 
    for xml path('')), 1, 1, '') 
from t 

リターン:

+----------+-----------+---------------------------------+ 
| lastname | firstname |   Location    | 
+----------+-----------+---------------------------------+ 
| Kennedy | Tom  | Maine Hospital     | 
| Smith | John  | Orlando Hospital,Tampa Hospital | 
+----------+-----------+---------------------------------+ 

が、問題のコードはlocationためサブクエリで外部テーブルを参照しています

select distinct lastname, firstname 
, Location= stuff((select distinct ',' + t.location 
    from t as i 
    where t.lastname = i.lastname 
     and t.firstname = i.firstname 
    for xml path('')), 1, 1, '') 
from t 

リターン:

+----------+-----------+------------------+ 
| lastname | firstname |  Location  | 
+----------+-----------+------------------+ 
| Kennedy | Tom  | Maine Hospital | 
| Smith | John  | Orlando Hospital | 
| Smith | John  | Tampa Hospital | 
+----------+-----------+------------------+ 
関連する問題