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 路径,所以不确定如何为此定义标签。它只是在它的末尾打印值,所以我知道它的工作,但我需要将该标签定义为&lt;inVoting&gt;true&lt;/inVoting&gt;
然后将其添加到我猜的字符串中。 THEN '&lt;inVoting&gt;true&lt;/inVoting&gt;
以上是关于TSQL 如果存在于子查询中的主要内容,如果未能解决你的问题,请参考以下文章