2015-08-24 46 views
-2

我有一個帶有大量查詢的sql查詢。SQL連接到很多行

但我會盡量做到簡單

Table.Result

Id 
Result 

Table.ResultGender

ResultID 
GenderID 

Table.Gender

Id 
Gender 

一個結果可以有不止一個性別。 所以想這樣

Result    | Gender 

Some result  | Female 

Another result  | Female, male 

結果,但我發現

Result    | Gender 

Some result  | Female 

Another result  | male 

Another result  | Female 

查詢:

SELECT Gender.Name , Result.Result  
    FROM Gender 
LEFT OUTER JOIN ResultGender ON Gender.Id = ResultGender.GenderId 
LEFT OUTER JOIN Result ON ResultGender.ResultId = Result.Id 

UPDATE

我已經試過這

SELECT Gender.Name , Result.Result , 
    STUFF((SELECT ',' + Name 
    FROM   Gender 
    WHERE  (Id = Gender_1.Id) FOR XML PATH(''))as varchar(max)) AS test 
    FROM   Gender AS Gender_1 
LEFT OUTER JOIN ResultGender ON Gender_1.Id = ResultGender.GenderId 
LEFT OUTER JOIN Result ON ResultGender.ResultId = Result.Id 

而這SQL經理

SELECT Gender.Name , Result.Result , 
    CAST((SELECT ',' + Name 
    FROM   Gender 
    WHERE  (Id = Gender_1.Id) FOR XML PATH(''))as varchar(max)) AS test 
    FROM   Gender AS Gender_1 
LEFT OUTER JOIN ResultGender ON Gender_1.Id = ResultGender.GenderId 
LEFT OUTER JOIN Result ON ResultGender.ResultId = Result.Id 

兩者都試圖挽救一個RPT文件

+1

根據數據庫使用的是你可以使用像[LISTAGG]一個聚合函數(http://docs.oracle。 com/database/121/SQLRF/functions100.htm)from oracle or [group_concat](http://stackoverflow.com/questions/9456380/aggregate-function-in-mysql-list-like-listagg-in-oracle)from MySQL的。你只需要一個組,並且你會得到結果 – SomeJavaGuy

+1

所以你想要聚合你的數據,例如每個結果得到逗號分隔的性別列表?什麼是你的DBMS?有些提供了LISTAGG和GROUP_CONCAT這樣的功能,其他則沒有。編輯:凱文是快了很多:-) –

+1

請刪除所有這些連接標記並標記您的DBMS(MySQL,SQL Server,Oracle或其他)。 –

回答

0

嘗試以下操作:

DECLARE @Result VARCHAR(8000) 
SELECT Gender.Name, @Result = COALESCE(@Result + ', ', '') + Result.Result 
FROM Gender 
JOIN Result ON Gender.Id = Result.Id 
JOIN ResultGender ON Gender.Id = ResultGender.GenderId 
    AND StudyResult.Id = ResultGender.ResultId 
+0

我得到這個錯誤_Msg 141,Level 15,State 1,Line 2 一個SELECT語句,它爲變量賦值不得與數據檢索操作結合使用._ – AWR

0

要加入不正確。 Gender.Id是性別記錄的ID,Result.Id是結果記錄的ID。因此Gender.Id = Result.Id是沒有意義的。 ResultGender是您需要用於連接的brige表:Gender - > GenderResult - > Result。

對於您的實際要求:按Result分組,以便每個結果獲得一條記錄。獲取與適當的功能您的性別列表(我展示在這裏與MySQL的GROUP_CONCAT。)

select 
    r.result  
    group_concat(g.name) 
from result r 
inner join resultgender rg on rg.resultid = r.id 
inner join gender g on g.id = rg.genderid 
group by r.result; 

不幸的是SQL Server不提供這樣的功能GROUP_CONCAT。它需要用一些XML PATH和STUFF來代替。見這裏:How to make a query with group_concat in sql server

如果您有結果沒有性別,使用外連接來代替:

left join resultgender rg on rg.resultid = r.id 
left join gender g on g.id = rg.genderid