2010-07-07 4 views
1

Microsoft SQL Server 2005를 사용하고 있습니다.여러 행을 연결하십시오.

하위 쿼리가 필요하다고 생각합니다.

고객 당 1 행을 찾고 있는데, AvailableAction 필드는 각 고객에 대한 모든 조치를 연결 한 것입니다.

use tempdb 
GO 
IF DB_ID('myDatabase') IS NOT NULL 
    DROP DATABASE myDatabase 
go 
CREATE DATABASE myDatabase 
GO 
USE myDatabase 
GO 
create table Cust(
CustID Int Identity Primary Key, 
CustName Varchar(255) 
) 
GO 
INSERT INTO Cust(CustName) values('One') 
INSERT INTO Cust(CustName) values('Two') 
GO 
CREATE TABLE Action(
ActionID Int Identity(101,1) Primary Key, 
ActionName Varchar(128) 
) 
GO 
INSERT INTO Action(ActionName) VALUES('Insert') 
INSERT INTO Action(ActionName) VALUES('Update') 
INSERT INTO Action(ActionName) VALUES('Delete') 
INSERT INTO Action(ActionName) VALUES('Print') 
GO 
create table CustAction(
CustActionID Int Identity Primary Key, 
CustID Int, 
ActionID Int 
) 
GO 
INSERT INTO CustAction(CustID,ActionID) VALUES(1,101) 
INSERT INTO CustAction(CustID,ActionID) VALUES(1,102) 
INSERT INTO CustAction(CustID,ActionID) VALUES(2,102) 
INSERT INTO CustAction(CustID,ActionID) VALUES(2,103) 
GO 
SELECT Cust.CustID,CustName,ActionName 
FROM CustAction 
JOIN Cust 
ON CustAction.CustID = Cust.CustID 
JOIN Action 
ON CustAction.ActionID = Action.ActionID 
GO 
SELECT 
Cust.CustID,CustName, 
'<option value="' + CAST(Action.ActionID AS Varchar) + '">' + ActionName + '</option>' AS AvailableAction 
FROM CustAction 
JOIN Cust 
ON CustAction.CustID = Cust.CustID 
JOIN Action 
ON CustAction.ActionID = Action.ActionID 

나는 것으로 출력을 싶습니다

CustID AvailableAction 

    1 <option value="101">Insert</option><option value="102">Update</option> 
    2 <option value="102">Update</option><option value="103">Delete</option> 

답변

3

2005 +

SELECT CustID 
    , (SELECT ca.ActionID [@value] 
      , ActionName [text()] 
      FROM dbo.CustAction ca 
     INNER JOIN dbo.Action ON ca.ActionID = Action.ActionID 
     WHERE ca.CustID = c.CustID 
      FOR XML PATH('option'), TYPE) AvailableAction 
    FROM dbo.Cust c 

들어 간단한 해결책은 간다).

+1

오우! 이것은 정말 대단합니다. –

+0

+1 나는 더 좋은 방법이 있어야한다는 것을 알았다! –

1

는 여기에 내가 SQL 서버 XML을 알고있는 사람이 나아져됩니다 확신 방법입니다! 난 당신이 EXPLICIT XML 용으로이를 얻을 수있을 거라 생각하지 않기 때문에이 2000 인 경우 당신은 멀리로 (운이있어

SELECT CustID , 
     CustName, 
     REPLACE(REPLACE(
     (SELECT '<option value="' + CAST(ACTION.ActionID AS VARCHAR) + '">' + ActionName + '</option>' 
     FROM ACTION 
       JOIN CustAction 
       ON  CustAction.CustID = Cust.CustID 
     WHERE CustAction.ActionID  = ACTION.ActionID FOR XML PATH('') 
     ) 
     ,'&lt;','<'),'&gt;','>') AvailableAction 
FROM Cust 
관련 문제