Sql 如何编写复杂查询

Sql 如何编写复杂查询,sql,sql-server,Sql,Sql Server,我需要一些关于SQL查询的帮助。类型、ProcessID和ParentProcessID是表的列。我需要做的是搜索类型“P”。然后,获取它的ProcessID。一旦我有了它的ProcessID,我就需要得到由类型为“P”的进程生成的所有类型为“s”的进程。例如: Type ProcessID ParentProcessID ------------------------------------ P 1001049 1000052 S 1001050 1001049

我需要一些关于SQL查询的帮助。类型、ProcessID和ParentProcessID是表的列。我需要做的是搜索类型“P”。然后,获取它的ProcessID。一旦我有了它的ProcessID,我就需要得到由类型为“P”的进程生成的所有类型为“s”的进程。例如:

Type    ProcessID   ParentProcessID
------------------------------------
P   1001049    1000052
S   1001050    1001049
S   1001051    1001049
S   1001052    1001049
S   1001053    1001049

P   1002015    1000045
S   1002016    1002015
S   1002017    1002015
S   1002018    1002015
S   1002019    1002015
我可以编写一个伪代码,但我对SQL一无所知

select * from table where Type=P...
。。。

任何想法都将不胜感激。

简单解决方案:

select *
from table as Spawns
where Spawns.Type = 'S' and Spawns.ParentProcessID in (
    select Parents.ProcessID
    from table as Parents
    where Parents.Type = 'P'
)
朴素的解决方案:

select *
from table as Spawns
where Spawns.Type = 'S' and Spawns.ParentProcessID in (
    select Parents.ProcessID
    from table as Parents
    where Parents.Type = 'P'
)

您可以使用
EXISTS
获取结果集

select *
from table as Spawns
where Spawns.Type = 'S' and EXISTS (
    select 1
    from table as Parents
    where Parents.Type = 'P'
    and Spawns.ParentProcessID =Parents.ProcessID   
)

您可以使用
EXISTS
获取结果集

select *
from table as Spawns
where Spawns.Type = 'S' and EXISTS (
    select 1
    from table as Parents
    where Parents.Type = 'P'
    and Spawns.ParentProcessID =Parents.ProcessID   
)

在SQLServer中,我喜欢使用公共表表达式。它有助于保持查询的不同元素的直截了当

With GetProcess as (

select ProcessID
from tableA
where Type = 'P')

select S.ProcessID 
from tableA S
join GetProcess P on S.processId = P.ProcessID
where S.type = 'S'

因此,CTE会在type=p的位置获取您的ProcessID。然后,再次将其连接到表中,并查找“S”类型。

在Sql Server中,我喜欢使用公共表表达式。它有助于保持查询的不同元素的直截了当

With GetProcess as (

select ProcessID
from tableA
where Type = 'P')

select S.ProcessID 
from tableA S
join GetProcess P on S.processId = P.ProcessID
where S.type = 'S'

因此,CTE在type=p的位置获取您的ProcessID。然后,再次将其加入到您的表中并查找“S”类型。

谢谢Mihai,我要编辑它。谢谢Mihai,我要编辑它。我想您需要使用
Parents.ProcessID
列映射到
Spawns.ParentProcessID
,由于您需要映射子查询中标识的线程生成的派生线程。@Smutje,我还有一个问题(添加为另一个解决方案)与我的建议。有什么想法吗?Thnks!我认为您需要使用
Parents.ProcessID
列映射到
Spawns.ParentProcessID
,因为您需要映射子查询中标识的线程所生成的派生线程。@Smutje,我还有一个问题(作为另一个解决方案添加)和我的建议。有什么想法吗?Thnks!谢谢大家,我会试试这个。但是,我想了解更多…这是PL/SQL吗?谢谢谢谢大家,我会试试这个。但是,我想了解更多…这是PL/SQL吗?谢谢