SQL FOR XML 嵌套行列表
SQL FOR XML list of nested rows
我有这个超长的 SQL 查询,现在这个查询所做的如下,创建第一级,即 Job_No...第二级的下一个获得所有'BaselineStart' 然而,这将每个 BaselineStart 与 baseOrSchedStartList 分开,我想要做的是为每个 Job_No 设置 1 个 baseOrSchedStartList,并在 baseOrSchedStartList 下设置每个 'string'。我希望这是有道理的。这是我的查询:
SELECT [Job_No] as '@Key',
(
SELECT ISNULL(UserDate1,ScheduleTasks.BaselineStart) AS 'string'
FROM ScheduleTasks INNER JOIN Schedule ON ScheduleTasks.ScheduleID = Schedule.ScheduleID INNER JOIN V_CONSTAT_ACTUAL_DATES ON V_CONSTAT_ACTUAL_DATES.JOB_NUMBER = Schedule.Job_No WHERE Job_No IN (SELECT JOB_NUMBER
FROM V_CONSTAT_ACTUAL_DATES
WHERE AREA_DESC = 'Orchard Park'
AND (DATE_TO_END IS NOT NULL AND DATE_TO_END >= GETDATE())) AND
(
LibraryTaskID <> 203
AND LibraryTaskID <> 204
AND LibraryTaskID <> 210
AND LibraryTaskID <> 211
AND LibraryTaskID <> 214
AND LibraryTaskID <> 215
AND LibraryTaskID <> 218
AND LibraryTaskID <> 219
AND LibraryTaskID <> 224
AND LibraryTaskID <> 227
AND LibraryTaskID <> 230
AND LibraryTaskID <> 231
AND LibraryTaskID <> 232
AND LibraryTaskID <> 233
AND LibraryTaskID <> 234
AND LibraryTaskID <> 235
AND LibraryTaskID <> 236
AND LibraryTaskID <> 237
AND LibraryTaskID <> 238
AND LibraryTaskID <> 239
AND LibraryTaskID <> 240
AND LibraryTaskID <> 242
AND LibraryTaskID <> 243
AND LibraryTaskID <> 295
AND LibraryTaskID <> 299
AND LibraryTaskID <> 303
AND LibraryTaskID <> 304
AND LibraryTaskID <> 305
AND LibraryTaskID <> 313
AND LibraryTaskID <> 314
AND LibraryTaskID <> 321
AND LibraryTaskID <> 333
)
ORDER BY DATE_TO_END, SortOrder
FOR XML PATH('baseOrSchedStartList'), Type
)
FROM ScheduleTasks INNER JOIN Schedule ON ScheduleTasks.ScheduleID = Schedule.ScheduleID INNER JOIN V_CONSTAT_ACTUAL_DATES ON V_CONSTAT_ACTUAL_DATES.JOB_NUMBER = Schedule.Job_No WHERE Job_No IN (SELECT JOB_NUMBER
FROM V_CONSTAT_ACTUAL_DATES
WHERE AREA_DESC = 'Orchard Park'
AND (DATE_TO_END IS NOT NULL AND DATE_TO_END >= GETDATE())) AND
(
LibraryTaskID <> 203
AND LibraryTaskID <> 204
AND LibraryTaskID <> 210
AND LibraryTaskID <> 211
AND LibraryTaskID <> 214
AND LibraryTaskID <> 215
AND LibraryTaskID <> 218
AND LibraryTaskID <> 219
AND LibraryTaskID <> 224
AND LibraryTaskID <> 227
AND LibraryTaskID <> 230
AND LibraryTaskID <> 231
AND LibraryTaskID <> 232
AND LibraryTaskID <> 233
AND LibraryTaskID <> 234
AND LibraryTaskID <> 235
AND LibraryTaskID <> 236
AND LibraryTaskID <> 237
AND LibraryTaskID <> 238
AND LibraryTaskID <> 239
AND LibraryTaskID <> 240
AND LibraryTaskID <> 242
AND LibraryTaskID <> 243
AND LibraryTaskID <> 295
AND LibraryTaskID <> 299
AND LibraryTaskID <> 303
AND LibraryTaskID <> 304
AND LibraryTaskID <> 305
AND LibraryTaskID <> 313
AND LibraryTaskID <> 314
AND LibraryTaskID <> 321
AND LibraryTaskID <> 333
)
GROUP BY [Job_No]
FOR XML PATH('Job_No'), ROOT('Root')
此查询returns此数据:
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-10T16:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
我要找的是:
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
<string>2015-08-10T16:00:00</string>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
如有任何帮助,我们将不胜感激。
UPDATE 根据您的
如果你只是从 AS [@Key]
中拿走 @
你会得到这个
DECLARE @tbl TABLE([Key] VARCHAR(10),DateValue DATETIME);
INSERT INTO @tbl VALUES ('ORC0023','2015-09-11T08:00:00')
,('ORC0023','2015-08-10T16:00:00')
,('ORC0023','2015-08-11T16:00:00')
DECLARE @UniqueKey VARCHAR(10)='ORC0023';
SELECT @UniqueKey AS [Key]
,(
SELECT DateValue AS [string]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH(''),TYPE
) AS baseOrSchedStartList
FOR XML PATH('Job_No'),ROOT('Root')
/*
<Root>
<Job_No>
<Key>ORC0023</Key>
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
<string>2015-08-10T16:00:00</string>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
*/
UPDATE2 对于您的实际查询,这意味着(可能)
尝试将 as '@Key'
更改为 as Key
和
ORDER BY DATE_TO_END, SortOrder
FOR XML PATH('baseOrSchedStartList'), Type
)
到
ORDER BY DATE_TO_END, SortOrder
FOR XML PATH(''), Type
) AS baseOrSchedStartList
另一种选择是 - 正如 BateTech 在评论中指出的那样 - 将你的 "baseOrSchedStart" 作为 ,ROOT('baseOrSchedStart')
放在 FOR XML PATH('')
后面并让括号未命名...
上一个
没有您的 table 的结构和测试数据,很难完全理解您的查询(实际上 超长 :-))
因此我准备了一个简化的结构示例,希望您能理解该方法并将其转移到您的实际数据中
只需尝试以下操作:
DECLARE @tbl TABLE([Key] VARCHAR(10),DateValue DATETIME);
INSERT INTO @tbl VALUES ('ORC0023','2015-09-11T08:00:00')
,('ORC0023','2015-08-10T16:00:00')
,('ORC0023','2015-08-11T16:00:00')
DECLARE @UniqueKey VARCHAR(10)='ORC0023';
--This is structurally what you've got
SELECT @UniqueKey AS [@Key]
,(
SELECT DateValue AS [string]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH('baseOrSchedStartList'),TYPE
)
FOR XML PATH('Job_No'),ROOT('Root')
/*
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-10T16:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
*/
现在试试这个
SELECT @UniqueKey AS [@Key]
,(
SELECT DateValue AS [*]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH('string'),TYPE
) AS baseOrSchedStartList
FOR XML PATH('Job_No'),ROOT('Root')
/*
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
<string>2015-08-10T16:00:00</string>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
*/
顺便说一句:这与此相同:
SELECT @UniqueKey AS [@Key]
,(
SELECT DateValue AS [string]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH(''),TYPE
) AS baseOrSchedStartList
FOR XML PATH('Job_No'),ROOT('Root')
我有这个超长的 SQL 查询,现在这个查询所做的如下,创建第一级,即 Job_No...第二级的下一个获得所有'BaselineStart' 然而,这将每个 BaselineStart 与 baseOrSchedStartList 分开,我想要做的是为每个 Job_No 设置 1 个 baseOrSchedStartList,并在 baseOrSchedStartList 下设置每个 'string'。我希望这是有道理的。这是我的查询:
SELECT [Job_No] as '@Key',
(
SELECT ISNULL(UserDate1,ScheduleTasks.BaselineStart) AS 'string'
FROM ScheduleTasks INNER JOIN Schedule ON ScheduleTasks.ScheduleID = Schedule.ScheduleID INNER JOIN V_CONSTAT_ACTUAL_DATES ON V_CONSTAT_ACTUAL_DATES.JOB_NUMBER = Schedule.Job_No WHERE Job_No IN (SELECT JOB_NUMBER
FROM V_CONSTAT_ACTUAL_DATES
WHERE AREA_DESC = 'Orchard Park'
AND (DATE_TO_END IS NOT NULL AND DATE_TO_END >= GETDATE())) AND
(
LibraryTaskID <> 203
AND LibraryTaskID <> 204
AND LibraryTaskID <> 210
AND LibraryTaskID <> 211
AND LibraryTaskID <> 214
AND LibraryTaskID <> 215
AND LibraryTaskID <> 218
AND LibraryTaskID <> 219
AND LibraryTaskID <> 224
AND LibraryTaskID <> 227
AND LibraryTaskID <> 230
AND LibraryTaskID <> 231
AND LibraryTaskID <> 232
AND LibraryTaskID <> 233
AND LibraryTaskID <> 234
AND LibraryTaskID <> 235
AND LibraryTaskID <> 236
AND LibraryTaskID <> 237
AND LibraryTaskID <> 238
AND LibraryTaskID <> 239
AND LibraryTaskID <> 240
AND LibraryTaskID <> 242
AND LibraryTaskID <> 243
AND LibraryTaskID <> 295
AND LibraryTaskID <> 299
AND LibraryTaskID <> 303
AND LibraryTaskID <> 304
AND LibraryTaskID <> 305
AND LibraryTaskID <> 313
AND LibraryTaskID <> 314
AND LibraryTaskID <> 321
AND LibraryTaskID <> 333
)
ORDER BY DATE_TO_END, SortOrder
FOR XML PATH('baseOrSchedStartList'), Type
)
FROM ScheduleTasks INNER JOIN Schedule ON ScheduleTasks.ScheduleID = Schedule.ScheduleID INNER JOIN V_CONSTAT_ACTUAL_DATES ON V_CONSTAT_ACTUAL_DATES.JOB_NUMBER = Schedule.Job_No WHERE Job_No IN (SELECT JOB_NUMBER
FROM V_CONSTAT_ACTUAL_DATES
WHERE AREA_DESC = 'Orchard Park'
AND (DATE_TO_END IS NOT NULL AND DATE_TO_END >= GETDATE())) AND
(
LibraryTaskID <> 203
AND LibraryTaskID <> 204
AND LibraryTaskID <> 210
AND LibraryTaskID <> 211
AND LibraryTaskID <> 214
AND LibraryTaskID <> 215
AND LibraryTaskID <> 218
AND LibraryTaskID <> 219
AND LibraryTaskID <> 224
AND LibraryTaskID <> 227
AND LibraryTaskID <> 230
AND LibraryTaskID <> 231
AND LibraryTaskID <> 232
AND LibraryTaskID <> 233
AND LibraryTaskID <> 234
AND LibraryTaskID <> 235
AND LibraryTaskID <> 236
AND LibraryTaskID <> 237
AND LibraryTaskID <> 238
AND LibraryTaskID <> 239
AND LibraryTaskID <> 240
AND LibraryTaskID <> 242
AND LibraryTaskID <> 243
AND LibraryTaskID <> 295
AND LibraryTaskID <> 299
AND LibraryTaskID <> 303
AND LibraryTaskID <> 304
AND LibraryTaskID <> 305
AND LibraryTaskID <> 313
AND LibraryTaskID <> 314
AND LibraryTaskID <> 321
AND LibraryTaskID <> 333
)
GROUP BY [Job_No]
FOR XML PATH('Job_No'), ROOT('Root')
此查询returns此数据:
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-10T16:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
我要找的是:
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
<string>2015-08-10T16:00:00</string>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
如有任何帮助,我们将不胜感激。
UPDATE 根据您的
如果你只是从 AS [@Key]
中拿走 @
你会得到这个
DECLARE @tbl TABLE([Key] VARCHAR(10),DateValue DATETIME);
INSERT INTO @tbl VALUES ('ORC0023','2015-09-11T08:00:00')
,('ORC0023','2015-08-10T16:00:00')
,('ORC0023','2015-08-11T16:00:00')
DECLARE @UniqueKey VARCHAR(10)='ORC0023';
SELECT @UniqueKey AS [Key]
,(
SELECT DateValue AS [string]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH(''),TYPE
) AS baseOrSchedStartList
FOR XML PATH('Job_No'),ROOT('Root')
/*
<Root>
<Job_No>
<Key>ORC0023</Key>
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
<string>2015-08-10T16:00:00</string>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
*/
UPDATE2 对于您的实际查询,这意味着(可能)
尝试将 as '@Key'
更改为 as Key
和
ORDER BY DATE_TO_END, SortOrder
FOR XML PATH('baseOrSchedStartList'), Type
)
到
ORDER BY DATE_TO_END, SortOrder
FOR XML PATH(''), Type
) AS baseOrSchedStartList
另一种选择是 - 正如 BateTech 在评论中指出的那样 - 将你的 "baseOrSchedStart" 作为 ,ROOT('baseOrSchedStart')
放在 FOR XML PATH('')
后面并让括号未命名...
上一个
没有您的 table 的结构和测试数据,很难完全理解您的查询(实际上 超长 :-))
因此我准备了一个简化的结构示例,希望您能理解该方法并将其转移到您的实际数据中
只需尝试以下操作:
DECLARE @tbl TABLE([Key] VARCHAR(10),DateValue DATETIME);
INSERT INTO @tbl VALUES ('ORC0023','2015-09-11T08:00:00')
,('ORC0023','2015-08-10T16:00:00')
,('ORC0023','2015-08-11T16:00:00')
DECLARE @UniqueKey VARCHAR(10)='ORC0023';
--This is structurally what you've got
SELECT @UniqueKey AS [@Key]
,(
SELECT DateValue AS [string]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH('baseOrSchedStartList'),TYPE
)
FOR XML PATH('Job_No'),ROOT('Root')
/*
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-10T16:00:00</string>
</baseOrSchedStartList>
<baseOrSchedStartList>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
*/
现在试试这个
SELECT @UniqueKey AS [@Key]
,(
SELECT DateValue AS [*]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH('string'),TYPE
) AS baseOrSchedStartList
FOR XML PATH('Job_No'),ROOT('Root')
/*
<Root>
<Job_No Key="ORC0023">
<baseOrSchedStartList>
<string>2015-09-11T08:00:00</string>
<string>2015-08-10T16:00:00</string>
<string>2015-08-11T16:00:00</string>
</baseOrSchedStartList>
</Job_No>
</Root>
*/
顺便说一句:这与此相同:
SELECT @UniqueKey AS [@Key]
,(
SELECT DateValue AS [string]
FROM @tbl AS tbl
WHERE tbl.[Key]=@UniqueKey
FOR XML PATH(''),TYPE
) AS baseOrSchedStartList
FOR XML PATH('Job_No'),ROOT('Root')