选择逗号分页列值

时间:2016-05-27 10:19:15

标签: sql sql-server

我试图在SQL Server中获取逗号,分隔列值。

Select 
CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type,

Label = STUFF((
          SELECT ',' +JFFO.Label
          FROM dbo.FormFieldOption JFFO
          where JFFO.FieldId = FF.FieldId
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
Value= STUFF((
          SELECT ',' +JFFO.Value
          FROM dbo.FormFieldOption JFFO
          where JFFO.FieldId = FF.FieldId
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
AdditionalTextfieldName= STUFF((
          SELECT ',' +JFFO.AdditionalTextfieldName
          FROM dbo.FormFieldOption JFFO
          where JFFO.FieldId = FF.FieldId
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

from EmployeeClaimTypeRelationship ECR 
LEFT JOIN ClaimType CT on CT.MHWSchemeNo=ECR.MHWSchemeNo
LEFT JOIN ClaimFormClaimTypeRelationship CFCTR on CFCTR.ClaimTypeId=CT.ClaimTypeId
LEFT JOIN ClaimForm CF on CF.FormId=CFCTR.FormId
LEFT JOIN FormField FF on FF.FormId=CFCTR.FormId
LEFT JOIN FormFieldOption FFO on FFO.FieldId=FF.FieldId
where ECR.MHWUserId='CITITEST1'
group by FF.FieldId,CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type 

这是我的查询。它给了我正确的结果。我在这里使用group by子句。

现在我想优化此查询。

如上所示,我有3列逗号,分隔值来自同一张表。

有没有办法让我不必为不同的字段写多次相同的查询?

喜欢这个

Select 
CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type,

Label = STUFF((
          SELECT ',' +JFFO.Label
          FROM dbo.FormFieldOption JFFO
          where JFFO.FieldId = FF.FieldId
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
Value,AdditionalTextfieldName = STUFF((
          SELECT ',' +JFFO.Value as Value,','+JFFO.AdditionalTextfieldName as AdditionalTextfieldName
          FROM dbo.FormFieldOption JFFO
          where JFFO.FieldId = FF.FieldId
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

from EmployeeClaimTypeRelationship ECR 
LEFT JOIN ClaimType CT on CT.MHWSchemeNo=ECR.MHWSchemeNo
LEFT JOIN ClaimFormClaimTypeRelationship CFCTR on CFCTR.ClaimTypeId=CT.ClaimTypeId
LEFT JOIN ClaimForm CF on CF.FormId=CFCTR.FormId
LEFT JOIN FormField FF on FF.FormId=CFCTR.FormId
LEFT JOIN FormFieldOption FFO on FFO.FieldId=FF.FieldId
where ECR.MHWUserId='CITITEST1'
group by FF.FieldId,CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type

3 个答案:

答案 0 :(得分:1)

你可以有一个观点。

CREATE VIEW view_name AS
SELECT * FROM ... WHERE ...

(而不是*,你可能更愿意选择你可能需要的所有列的并集,并可能给它们别名。)那么你只需要

SELECT column1, column2, column3
FROM view_name
WHERE [additional conditions]

答案 1 :(得分:1)

我会创建一个UDF表值函数并调用它,它也会给你带来一些性能上的好处

功能定义

CREATE FUNCTION dbo.fn_FormFieldOptionList ( @FieldId INT)
RETURNS TABLE
AS
RETURN (
SELECT DISTINCT 
     Label = STUFF((
              SELECT ',' +JFFO.Label
              FROM dbo.FormFieldOption JFFO
              where JFFO.FieldId = FF.FieldId
              FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    ,Value= STUFF((
              SELECT ',' +JFFO.Value
              FROM dbo.FormFieldOption JFFO
              where JFFO.FieldId = FF.FieldId
              FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    ,AdditionalTextfieldName= STUFF((
              SELECT ',' +JFFO.AdditionalTextfieldName
              FROM dbo.FormFieldOption JFFO
              where JFFO.FieldId = FF.FieldId
              FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

FROM dbo.FormFieldOption FF
WHERE FF.FieldId = @FieldId ) 

您的查询

Select 
CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo
,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name
,FF.FormId,FF.FieldId,FF.Label,FF.Name
,FF.IsDefaultField,FF.IsFieldLabelVisible
,FF.IsRequired,FF.Type,f.Label. f.Value ,f.AdditionalTextfieldName 

from EmployeeClaimTypeRelationship ECR 
LEFT JOIN ClaimType CT on CT.MHWSchemeNo=ECR.MHWSchemeNo
LEFT JOIN ClaimFormClaimTypeRelationship CFCTR on CFCTR.ClaimTypeId=CT.ClaimTypeId
LEFT JOIN ClaimForm CF on CF.FormId=CFCTR.FormId
LEFT JOIN FormField FF on FF.FormId=CFCTR.FormId
OUTER APPLY  dbo.fn_FormFieldOptionList(FF.FieldId) f
where ECR.MHWUserId='CITITEST1'

答案 2 :(得分:0)

在此查询中,我们将加入dbo.FormFieldOption两次。好的优化&如果我们可以重构查询,可以实现速度。尝试重组连接 将表格 dbo.FormFieldOption 改为单身。