我正在使用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,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,'<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>
解决方法
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
我不认为你能用FOR XML EXPLICIT得到这个,所以如果这是2000你就不走运了(就简单的解决方案而言).