当另一行存在同一Id的非空列值时,如何忽略SQL Server查询中的空列值行

时间:2016-11-04 21:21:39

标签: sql sql-server

注意:老实说,不知道如何标题。 :/

使用以下SQL查询,我得到以下结果。

select distinct P.ID
        ,P.LASTNAME
        ,P.FIRSTNAME
        ,T.FLAG
        ,CASE WHEN T.FLAG = 'T' THEN T.NAME ELSE NULL END AS NAME
        ,CASE WHEN T.FLAG = 'T' THEN R.T_NUMBER ELSE NULL END AS T_NUMBER
        ,CASE WHEN T.FLAG = 'T' THEN T.E_NUMBER ELSE NULL END AS E_NUMBER
        ,CASE WHEN T.FLAG = 'T' THEN R.S_NUMBER ELSE NULL END AS S_NUMBER
from P
left outer join R on R.P_ID = P.ID 
left outer join T on T.ID = R.T_ID




ID  LASTNAME    FIRSTNAME   FLAG    NAME    T_NUMBER    E_NUMBER    S_NUMBER
11  ME          LOU         F       NULL    NULL        NULL        NULL
11  ME          LOU         T       NAME1   11          123         11115
11  ME          LOU         T       NAME2   22          456         22225
11  ME          LOU         T       NAME3   33          789         33335
11  ME          LOU         T       NAME4   44          012         44445
12  DON         JOE         NULL    NULL    NULL        NULL        NULL
13  SAM         CAR         NULL    NULL    NULL        NULL        NULL

我对查询进行了哪些更改,以便在结果集中不返回第一行,因为其他ID 11行包含数据,同时仍返回最后两行,因为ID没有其他行12和13?

给定一个ID,如果存在一个具有相同ID的行,其中包含非空NAME,T_NUMBER,E_NUMBER,S_NUMBER数据,那么我也不希望所有这些列中包含null的行。 下面是我想要的输出。

ID  LASTNAME    FIRSTNAME   FLAG    NAME    T_NUMBER    E_NUMBER    S_NUMBER
11  ME          LOU         T       NAME1   11          123         11115
11  ME          LOU         T       NAME2   22          456         22225
11  ME          LOU         T       NAME3   33          789         33335
11  ME          LOU         T       NAME4   44          012         44445
12  DON         JOE         NULL    NULL    NULL        NULL        NULL
13  SAM         CAR         NULL    NULL    NULL        NULL        NULL

我使用distinctgroup byunion进行了测试/测试但没有成功。

我不希望ME LOU的第一行的原因是因为我知道存在包含更多数据的记录,我可以从这些记录中获取该人的姓名。

我想要最后两行的原因是因为我仍然想要那个人记录,以便我知道它们存在。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望过滤掉{1}行,而不是1行。如果是这样的话:

'F'

答案 1 :(得分:0)

根据您的真实查询的复杂程度,您也可以在两个UNION语句中执行此操作,但不包括您不想要的条件:

select distinct P.ID
        ,P.LASTNAME
        ,P.FIRSTNAME
        ,T.FLAG
        ,T.NAME AS NAME
        ,R.T_NUMBER AS T_NUMBER
        ,T.E_NUMBER AS E_NUMBER
        ,R.S_NUMBER AS S_NUMBER
from P
inner join R on R.P_ID = P.ID 
inner join T on T.ID = R.T_ID
where
T.FLAG = 'T'  -- excludes T.FLAG = 'F'

UNION ALL

select P.ID
        ,P.LASTNAME
        ,P.FIRSTNAME
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,NULL
from P
left outer join R on P.ID = R.P_ID  
where
R.T_ID is null  -- excludes T.FLAG is not null