Sql 如果列包含特定值,则从结果中排除值

Sql 如果列包含特定值,则从结果中排除值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用SQL数据库,在该数据库中我收到以下数据: YEAR | REFERENCE | HEADER | USER | DATE | ID | Key | 2019 Charity Funding UCRP511 2020-01-15 0128923961US 2019 Charity Funding UCRP511 2

我正在使用SQL数据库,在该数据库中我收到以下数据:

YEAR  | REFERENCE      | HEADER    | USER       | DATE        | ID            | Key      |
2019    Charity Funding              UCRP511      2020-01-15    0128923961US    
2019    Charity Funding              UCRP511      2020-01-15    0128923961US    JBOT_P10
2019    Charity Funding              UCRP511      2020-01-15    0128923961US    
2019    Charity Funding              UCRP511      2020-01-15    0128923961US    
2019    Charity Funding              UCRP511      2020-01-15    0128923961US    
2019    SJ/1019/233                  UCRP511      2020-01-10    
2019    Computer Comp                UCRP511      2020-01-15    024543342OS1    
2019    SJ/1019/231                  UCRP539      2020-01-10    
2019    PAYROLL (SC)    LABOR DIST   UCRP539      2020-01-10                    JBOT_P10
我已尝试使用以下解决方案:

以下是我使用的查询:

SELECT DISTINCT *
FROM SDD.GenData s1
WHERE NOT EXISTS (
    SELECT 1
    FROM SDD.GenData s2
    WHERE s2.ID = s1.ID AND s2.Key LIKE '%BOT_P10'
)
以下是我要寻找的规则:

如果ID不为空,则该行保持不变 如果ID不是空的,但在同一ID的一行或多行的键中有一个值,则必须排除所有具有该ID的行。 如果ID为空且在键中有值,则排除该行。 若ID为空,Key为空,则行保持不变。 下面是一个基于上述输入的示例

YEAR  | REFERENCE      | HEADER    | USER     | DATE        | ID              | Key      |
2019    Computer Comp                UCRP511    2020-01-15    024543342OS1  
2019    SJ/1019/233                  UCRP511    2020-01-10    
2019    SJ/1019/231                  UCRP539    2020-01-10    
您可以使用exists:

您还可以使用窗口功能:

select t.*
from (select t.*,
             max(key) over (partition by id) as max_key
      from t
     ) t
where max_key is null or (id is null and [key] is null);
他是一把小提琴

你的规则和你说的不完全一样。规则似乎是:

id为NULL,key为NULL;或 非空id上没有非空密钥。
此查询将为您提供所需的结果;WHERE子句的第一部分排除具有给定ID值的行(如果其中任何一行具有排除的键值),第二部分包括ID值为空的行(只要键值不是排除的值):

SELECT DISTINCT *
FROM GenData s1
WHERE NOT EXISTS (SELECT * 
                  FROM GenData s2
                  WHERE s2.ID = s1.ID AND s2.[Key] LIKE '%BOT_P10'
                  )
  OR (ID = '' AND NOT [Key] LIKE '%BOT_P10')
输出:

YEAR    REFERENCE       HEADER  USER        DATE        ID              Key
2019    Computer Comp           UCRP511     2020-01-15  024543342OS1     
2019    SJ/1019/231             UCRP539     2020-01-10           
2019    SJ/1019/233             UCRP511     2020-01-10          

这似乎不起作用。我两个都没有收到返回的行queries@tastydew . . . 这两个查询都返回了行,所以我不知道为什么会得到没有返回的结果。但是,两人都没有完全返回您想要的集。我已经修改了查询并添加了一个DBFIDLE。我已经更新了我的问题。我认为我没有得到相同结果的原因是我忽略了澄清没有值的行不是空的,而是空的。我试图修改您对最后一行中change ID=的响应,但似乎没有得到正确的结果。我还澄清了我正在寻找的确切规则。@tastydew请参阅我的编辑。我想这就是你在更新的问题中所描述的。@tastydew我的编辑回答了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?
YEAR    REFERENCE       HEADER  USER        DATE        ID              Key
2019    Computer Comp           UCRP511     2020-01-15  024543342OS1     
2019    SJ/1019/231             UCRP539     2020-01-10           
2019    SJ/1019/233             UCRP511     2020-01-10