我们有2个SQL查询,用于从用户登录名中查找数据库锁,因为有时我们需要手动将其解锁。简而言之,我们运行以下查询,该查询将返回一些结果:
SELECT DISTINCT request_session_id
FROM [view_name]
WHERE [condition1] AND [condition2]
然后我们一次获取一个结果,并运行以下查询(更新@request_session_id变量之后),直到在结果的主机名列中找到显示正确用户名的行(spid值将对应于request_session_id):
DECLARE @request_session_id int;
SET @request_session_id = 107;
SELECT spid, status, hostname
FROM [view_name]
WHERE spid = @request_session_id
我想完成的(如果可能的话)是将这两个查询结合起来,以便找到request_session_id,然后自动运行第二个查询,显示第一个查询找到的每个ID的结果行。我对SQL还是很陌生,但是我对Powershell很熟悉,因此在Powershell中,我只是将查询1中的结果保存到变量中,然后使用foreach在查询2中循环这些结果。我不确定我如何用SQL达到相同的最终结果。
预先感谢您的帮助。
安德鲁
答案 0 :(得分:1)
您只是想IN
吗?
SELECT spid, status, hostname
FROM [view_name]
WHERE spid IN (SELECT request_session_id
FROM [view_name]
WHERE [condition1] AND [condition2]
);
答案 1 :(得分:1)
我会EXISTS
使用相关的子查询。与使用IN
的情况不同,这可以正确处理第一个查询返回为空的request_session_id
的情况:
SELECT spid, status, hostname
FROM [view_name] v1
WHERE EXISTS (
SELECT 1
FROM [view_name] v2
WHERE
[condition1]
AND [condition2]
AND v1.spid = v2.request_session_id
)
注意:很可能两个[view_name]
都属于不同的表;否则,逻辑将大大简化。
答案 2 :(得分:0)
就像上面的戈登所说的
SELECT spid, status, hostname
FROM [view_namea]
WHERE spid IN (SELECT request_session_id
FROM [view_nameb]
WHERE [condition1] AND [condition2]
);
答案 3 :(得分:0)
只需使用IN
子句来过滤所需的spid
值:
SELECT spid, status, hostname
FROM [view_name]
WHERE spid IN (
SELECT request_session_id
FROM [view_name]
WHERE [condition1] AND [condition2]
);
这将返回与spids
子查询中的条件匹配的IN
的结果。您无需在其中添加DISTINCT
,因为那样只会增加额外的处理。