【问题标题】:Having issue with the parameter that need to include both values需要包含两个值的参数有问题
【发布时间】:2021-03-28 07:28:28
【问题描述】:

我遇到了这个问题,我认为它与参数有关。我不确定我是否做得正确,但我 90% 确定查询中的参数不正确。所以,有两种形式(短格式和长格式)。

  • 短格式就是短格式
  • 长格式包括短格式和长格式一起

这是我的查询

SELECT  distinct
pid_respiratorfit.FormDimDocId,
pid_respiratorfit.EnrollDate,
pid_respiratorfit.Id,
pid_respiratorfit.FormDimDocInstanceId,
Patient.NEDID,
Patient.PFIRSTNAME,
Patient.PLASTNAME,
dimInputDetail.displayStatement AS DisplayStatement,
dimInputDetail.statement AS Measure,
dimInputDetail.structureID AS StructureID,
dimInputAnswers.Value AS Answers,
dimInputs.comments AS Findings,
dimInputs.ID as FindingsID,
dimDocSectionLayout.SectionTitle AS SectionTitle,
dimDocSectionLayout.[order] as dimDocSectionLayoutOrder,
dimDocSectionLayout.sectionID,
dimDocInputLayout.[order]
FROM     pid_respiratorfit INNER JOIN
                  dimInputDetail RIGHT OUTER JOIN
                  dimDocInputLayout ON dimInputDetail.ID = dimDocInputLayout.questionID LEFT OUTER JOIN
                  dimDocSectionLayout ON dimDocInputLayout.sectionID = dimDocSectionLayout.sectionID AND dimDocInputLayout.surveyID = dimDocSectionLayout.surveyID INNER JOIN
                  dimInstance ON dimInstance.dimDocID = dimDocSectionLayout.surveyID ON pid_respiratorfit.FormDimDocId = dimInstance.dimDocID AND
                  pid_respiratorfit.FormDimDocInstanceId = dimInstance.ID INNER JOIN
                  Patient ON pid_respiratorfit.PTIDNum = Patient.PTIDNUM RIGHT OUTER JOIN
                  dimDocMetaInfo ON dimInstance.dimDocID = dimDocMetaInfo.ID LEFT OUTER JOIN
                  dimInputsDialogue RIGHT OUTER JOIN
                  dimInputs ON dimInputsDialogue.DimInputsID = dimInputs.ID ON dimInputDetail.ID = dimInputs.inputID AND dimInstance.ID = dimInputs.dimDocInstanceID AND
                  dimDocMetaInfo.ID = dimInputs.dimDocID AND dimDocInputLayout.usageCount = dimInputs.usageCount LEFT OUTER JOIN
                  dimInputAnswers ON dimInputs.ID = dimInputAnswers.dimInputsID LEFT OUTER JOIN
                  dim_fileUploads ON dimInstance.ID = dim_fileUploads.dimDocInstanceID AND dimDocInputLayout.usageCount = dim_fileUploads.usageCount AND
                  dimInputDetail.ID = dim_fileUploads.inputID AND dimDocMetaInfo.ID = dim_fileUploads.dimDocID
WHERE  pid_respiratorfit.Id = @respfitID AND dimDocSectionLayout.sectionID = @sectionID
ORDER BY dimDocSectionLayout.[order], 
         dimDocInputLayout.[order];

如果记录只有简表,并且部分 ID 的参数将寻找值“1”,则表格将被成功打印。但是,如果记录具有长格式(也包括短格式)并且那是我现在遇到的问题,则部分 ID 将同时查找值“1”和“2”。但是到目前为止,我不知道如何添加包含短格式和长格式的参数并单独保留短格式值。

【问题讨论】:

    标签: sql sql-server-2008 parameters


    【解决方案1】:

    我不确定我是否理解你的问题,所以我会提供一个简化版本,如果我错了,你可以澄清一下。

    我认为您有一个包含问题列表的表格,每个问题都标有“表格”,短或长,我将分别表示为 1 和 2。每个问题都有一个应该打印的“顺序”,问题的一些文本,以及一系列其他细节,这些细节不影响选择。您传入一个参数,说明您想要短格式还是长格式,其中 Short 是所有标记为“1”的问题,Long 是所有标记为 2 以及所有标记为 1 的问题。

    如果这是您问题的本质,有几个选项会起作用,最好的选择取决于您的具体情况

    --This is your parameter, could be passed into a Stored Procedure or whatever
    DECLARE @FormLen INT = 1 --1 = ShortForm, 2 = LongForm
    
    ;with cteSampleData as (--Build some sample data
        SELECT * FROM (VALUES ('Taking medicine', 1, 1) 
            , ('Used Respirator', 2, 1), ('Lost vision', 3, 1), ('Back Injury', 4, 1)
            , ('High altitude', 5, 2), ('Harsh chemicals', 6, 2), ('Side jobs', 7, 2)
        ) as FormDef(QuestionText, QOrder, TargetForm)
    )SELECT * 
    FROM cteSampleData
    WHERE (TargetForm = @FormLen --Grab line when @FormLen = 1 and TargetForm = 1 
            --or @FormLen = 2 and TargetForm = 2 
        OR (@FormLen = 2 AND TargetForm = 1)) --Grab line when @FormLen = 2 AND TargetForm = 1, 
            -- adding in Short Form questions when LongForm is specified
        -- AND (other conditions, like CustomerID = @Customer) --Use to add in other requirements, note that the above
            --MUST be in parenthesis!
    --ALTERNATE FORM
    --WHERE TargetForm <= @FormLen
    ORDER BY QOrder, TargetForm
    

    如果您可以用整数表示 TargetForm,并且您希望较长的表单包含所有“较短”的表单,那么最好的选择是

    WHERE TargetForm <= @FormLen
    

    form,如果以后定义更多的深度层,它很简单,很容易缩放。

    如果您必须使用非整数表示,则最好使用 OR 格式

    WHERE (TargetForm = @FormLen --Grab line when @FormLen = 1 and TargetForm = 1 
            --or @FormLen = 2 and TargetForm = 2 
        OR (@FormLen = 2 AND TargetForm = 1)) --Grab line when @FormLen = 2 AND TargetForm = 1, 
    

    它也不能缩放,但对 TargetForm 的表示不敏感

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多