【问题标题】:TSQL If Exists within subqueryTSQL 如果存在于子查询中
【发布时间】:2014-07-09 19:18:43
【问题描述】:

我有一个按预期工作的查询,但是我想看到它 submissionID 存在于另一个表中。这是我当前查询的样子。

IF (@action = 'filter')
            BEGIN

                --Get the current active voting session
                DECLARE @session INT
                SET @session = (SELECT sessionID 
                FROM empowermentSessions 
                WHERE status = '1')

                SELECT A.[submissionID],
                       A.[subEmpID],
                       A.[nomineeEmpID],
                       CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate,
                       A.[situation],
                       A.[task],
                       A.[action],
                       A.[result],
                       A.[timestamp],
                       A.[statusID],
                       A.[approver],
                       A.[approvalDate],
                       B.[FirstName] + ' ' + B.[LastName] AS nomineeName,
                       B.[ntid] AS nomineeNTID,
                       B.[qid] AS nomineeQID,
                       C.[FirstName] + ' ' + C.[LastName] AS submitName,
                       C.[ntid] AS submitNTID,
                       D.[categoryName],
                       (

                       --If exists return true else false
                        select submissionID 
                        from empowermentEntries
                        where sessionID = @session



                       )
                FROM   empowermentSubmissions AS A
                       INNER JOIN
                       empTable AS B
                       ON A.[nomineeEmpID] = B.[empID]
                       INNER JOIN
                       empTable AS C
                       ON A.[subEmpID] = C.[empID]
                       INNER JOIN
                       empowermentCategories AS D
                       ON A.[categoryID] = D.[catID]
                WHERE  (A.[categoryID] = @category or @category = '')
                AND (A.[nomineeDepartment] = @department or @department = '')
                AND A.[submissionDate] >= @startDate and A.[submissionDate] <= @endDate
                FOR    XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');

您会注意到我在那里有一个子选择,我从那里开始,然后无法从那里弄清楚。我需要查看其他表中是否存在提交 ID,如果存在,则为 XML 值返回 true,否则返回 False。

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    没有必要对子选择执行此操作。您正在有效地检查您的变量 @session 是否有值。您还可以更简单地修改设置该变量的方式。

    DECLARE @session INT
    SELECT @session = sessionID 
    FROM empowermentSessions 
    WHERE status = '1'
    
    SELECT A.[submissionID],
           A.[subEmpID],
           A.[nomineeEmpID],
           CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate,
           A.[situation],
           A.[task],
           A.[action],
           A.[result],
           A.[timestamp],
           A.[statusID],
           A.[approver],
           A.[approvalDate],
           B.[FirstName] + ' ' + B.[LastName] AS nomineeName,
           B.[ntid] AS nomineeNTID,
           B.[qid] AS nomineeQID,
           C.[FirstName] + ' ' + C.[LastName] AS submitName,
           C.[ntid] AS submitNTID,
           D.[categoryName],
           case when @session IS NULL then 'false' else 'true' end
    FROM   empowermentSubmissions AS A
           INNER JOIN
           empTable AS B
           ON A.[nomineeEmpID] = B.[empID]
           INNER JOIN
           empTable AS C
           ON A.[subEmpID] = C.[empID]
           INNER JOIN
           empowermentCategories AS D
           ON A.[categoryID] = D.[catID]
    WHERE  (A.[categoryID] = @category or @category = '')
    AND (A.[nomineeDepartment] = @department or @department = '')
    AND A.[submissionDate] >= @startDate and A.[submissionDate] <= @endDate
    FOR    XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');
    

    【讨论】:

    • 我在会话表中有多个会话,但一次只能激活其中一个。我需要获取活动会话的 sessionID。然后,我使用此 ID 来确定该 sessionID 是否存在 submitID。我很确定
    • 对,我有点假设您只有 1 个。此代码可以正常工作。看变量。如果没有返回行,则该值将为 NULL。无需再次查询该表。
    • 我的解释可能不正确。我首先在第一个选择中找到活动的sessionID。然后我需要找出主选择中的submissionID 是否存在于另一个名为empowermentEntries 的表中。 @Session 将始终返回 true,因为始终存在活动会话。但是,我需要找出submissionID 是否存在于活动empowermentEntries 表中的@session
    • 也许这会帮助你理解我的设置:oi62.tinypic.com/5dvryt.jpg
    • 好的。然后只需将左连接添加到 powermentEntries。然后,您可以使用修改后的 case 表达式。 "当 statusID = '1' 然后 'True' 否则 'False' 结束时的情况"
    【解决方案2】:

    SQL Server 没有 bool 类型。你可以用一个案例来做到这一点。

    CASE WHEN (select count(1) 
    from empowermentEntries
    where sessionID = @session) > 0 THEN 'true' else 'false' end
    

    如果该行存在,您将获得 1 或更多的计数,这将在该列中放置“真”。如果它不存在,您将得到零返回,这将返回“false”。

    您也可以将 join 保留到 powermentEntries 并完全避免子选择。

    【讨论】:

    • 这有点用,但是我使用的是 XML 路径,所以不确定如何为此定义标签。它只是在它的末尾打印值,所以我知道它的工作,但我需要将该标签定义为&amp;lt;inVoting&amp;gt;true&amp;lt;/inVoting&amp;gt;
    • 然后将其添加到我猜的字符串中。 THEN 'true' ELSE false
    • 是的,我已经尝试过了,为 > 打印实体而不是创建标签
    • @SBB 你这是什么意思?你能告诉我你期望的结果吗?
    • 本应如上图但返回如下&amp;lt;inVoting&amp;gt;true&amp;lt;/inVoting&amp;gt;
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2011-04-13
    相关资源
    最近更新 更多