TSQL 如果存在于子查询中

Posted

技术标签:

【中文标题】TSQL 如果存在于子查询中【英文标题】:TSQL If Exists within subquery 【发布时间】: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。

【问题讨论】:

【参考方案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;

以上是关于TSQL 如果存在于子查询中的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助来提高一些 TSQL“不存在”的查询性能

更好的 tsql 查询来确定谁是新客户(或不存在的替代品)

如何在媒体查询设置的流体布局中垂直和水平居中子元素?

不存在的 TSQL 循环

Oracle 查询优化器是不是将*** where 子句应用于子查询或视图?

TSQL 左连接,只有右起最后一行