Sql server 检查是否找到特定记录,然后查找具有相同组的其他记录

Sql server 检查是否找到特定记录,然后查找具有相同组的其他记录,sql-server,Sql Server,我有一张桌子 主表 PROBLEM_ID PROBLEM PGROUP 1 Other Hardware Hardware 2 Error On hardware Hardware 3 PM Hardware 4 Service Maintenance 还有一个细节 TERM PROBLEM

我有一张桌子

主表

PROBLEM_ID  PROBLEM            PGROUP
1           Other Hardware     Hardware
2           Error On hardware  Hardware
3           PM                 Hardware
4           Service            Maintenance
还有一个细节

TERM          PROBLEM            PROBLEM_ID
S1G166901     PM                    3
S1G166902     PM                    3
S1G166903     Service               4
S1G166902     Other on hardware     1
S1G166901     Service               4
S1G166901     Other Hardware        1
S1G166901     Error on Hardware     2
我需要查询
PROBLEM\u ID
='41',然后找到一个
PROBLEM
具有
PGROUP
='Hardware'

像这样

TERM          PROBLEM            PROBLEM_ID    PGROUP
S1G166901     PM                    3          Hardware
S1G166901     Other hardware        1          Hardware             
S1G166901     Error on hardware     2          Hardware
S1G166902     PM                    3          Hardware
S1G166902     Other Hardware        1          Hardware
我尝试使用外部应用程序,但返回的行太多

我的具体结果是,如果它们不包含
PROBLEM\u ID
='41',则不会显示,但如果包含,则会按术语显示pgroup='Hardware'的所有问题

我试试这个

SELECT p.TERM, p.Problem_ID,p.problem, PGROUP
FROM Problem_log AS p 
CROSS APPLY ( 
            SELECT s.pgroup, s.problem_id 
            FROM problem AS s 
            WHERE   s.problem_id = p.problem_id AND PGROUP = 'Hardware'  )as s

            WHERE  exists (Select s.PGROUP,s.PROBLEM_ID 
            from PROBLEM_LOG 
            WHERE problem_log.PROBLEM_ID = '41'  GROUP BY term) 
            ORDER BY TERM
我的顺序是 -从表problem_log中为problem_ID='41'选择数据

  • 如果problem_ID='41',则针对每个记录检查发现其他问题(仅硬件)

您只需要使用主表的内部联接来获取每个问题ID的PGROUP

检查以下查询:

SELECT D.TERM, D.PROBLEM, D.PROBLEM_ID, M.PGROUP
FROM Details D INNER JOIN Master M ON D.ProblemID = M.ProblemID
WHERE EXISTS (SELECT * FROM Details WHERE PRoblem = 'PM' AND TERM = D.TERM)
你能试试这个吗

SELECT dt.Term, dt.Problem, dt.ProblemID
FROM DetailsTable dt
JOIN MasterTable mt ON dt.ProblemID = mt.ProblemID
JOIN MasterTable mt1 ON mt.PGroup = mt1.PGroup and mt1.Problem = 'PM'
ORDER BY dt.Term

我认为这个问题应该适用于你的情况

Select DISTINCT  D.TERM, M.PROBLEM, M.PROBLEM_ID, M.PGROUP
From Problem M Inner Join Problem_log D
ON M.PROBLEM=D.PROBLEM
WHERE (D.TERM IN (Select TERM FROM Problem_log D1 Inner Join Problem M1
                  ON M1.PROBLEM=D1.PROBLEM
                  Where D1.PROBLEM_ID=D.PROBLEM_ID And 
                        M1.PGROUP='Hardware' AND D1.Problem='PM'))
ORDER BY TERM,PROBLEM

您可以在

上尝试此查询,您只需要在主表中使用内部联接,并在select语句中使用PGROUP。@PareshJ我的具体结果是,如果它们不包含PM,则不会显示,但如果包含将按术语显示PGROUP='Hardware'的所有问题,但如果使用内部联接,则会显示所有问题,对吗?我只需要如果问题='PM'存在,你的代码几乎可以工作,但它仍然显示一个不包含'PM'的术语。在看到你的帖子之前,我尝试了我自己的方法。它与你的代码保持相同的结果。我不明白为什么子查询是必要的。在你的提琴里,我用组和问题条件代替了整件事。它给了我同样的结果。(当然,在两个表中都有问题文本可能也是个坏主意。)@shawnt00看看我的编辑历史,我以前也做过同样的事情。但是,它没有在OP的数据库中显示正确的结果。我不知道怎么做,但它工作正常。