Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除记录的SQL帮助_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

删除记录的SQL帮助

删除记录的SQL帮助,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个查询返回多条记录,这些记录成对出现。记录对列中的某些信息是相同的,例如ID和year,但其他信息的值不同,例如type列可能为null,而另一列可能为A 如果第三列类型等于其中一对的“A”或另一个任意字符串,如何让它在SQL查询的WHERE部分排除具有相同id和年份的两个记录?我想可以使用case语句,但我不确定。您可以使用notexists和子查询 SELECT id, year FROM table t WHERE NOT EXISTS (SELECT * FROM table t2

我有一个查询返回多条记录,这些记录成对出现。记录对列中的某些信息是相同的,例如ID和year,但其他信息的值不同,例如type列可能为null,而另一列可能为A


如果第三列类型等于其中一对的“A”或另一个任意字符串,如何让它在SQL查询的WHERE部分排除具有相同id和年份的两个记录?我想可以使用case语句,但我不确定。

您可以使用notexists和子查询

SELECT id, year
FROM table t
WHERE NOT EXISTS (SELECT * FROM table t2 
                  WHERE ThirdColumn = 'A'
                  AND t2.id = t.id
                  AND t2.year = t.year)

您可以使用“不存在”和子查询

SELECT id, year
FROM table t
WHERE NOT EXISTS (SELECT * FROM table t2 
                  WHERE ThirdColumn = 'A'
                  AND t2.id = t.id
                  AND t2.year = t.year)

不那么直截了当

select t.*
from tbl t
left join (
  select t2.id, t2.year
  from tbl t2
  group by t2.id, t2.year
  having count(*) > 1 and
      count(case when type='A' then 1 end) *
      count(case when type='A' then null else 1 end) > 0
) X
  on X.id = t.id and X.year = t.year
WHERE X.id is null
    代码>计数(*)> 1 < /代码>帮助我们考虑至少有一对具有相同ID /年的位置。
  • 2
    count(case..)>0
    s确定“至少一个
    类型
    s为“A”,而至少一个不是”
  • LEFT JOIN+WHERE IS NULL
    是一种经典技术,用于仅显示LEFT JOIN失败的数据,即取出满足子查询条件的id/年对

    • 不那么简单

      select t.*
      from tbl t
      left join (
        select t2.id, t2.year
        from tbl t2
        group by t2.id, t2.year
        having count(*) > 1 and
            count(case when type='A' then 1 end) *
            count(case when type='A' then null else 1 end) > 0
      ) X
        on X.id = t.id and X.year = t.year
      WHERE X.id is null
      
        代码>计数(*)> 1 < /代码>帮助我们考虑至少有一对具有相同ID /年的位置。
      • 2
        count(case..)>0
        s确定“至少一个
        类型
        s为“A”,而至少一个不是”
      • LEFT JOIN+WHERE IS NULL
        是一种经典技术,用于仅显示LEFT JOIN失败的数据,即取出满足子查询条件的id/年对

      是的,您可以使用用例并在结尾处按distinct进行过滤,如果您提供一些样本,我们可以为您提供更精确的答案是的,您可以使用用例并在结尾处按distinct进行过滤,如果您提供一些样本,我们可以为您提供更精确的答案,这将导致(2)表格扫描,不是非常理想的解决方案相同的ID可以超过2个,比如说可以有8个,但是每年只返回2个相同的ID,因此每年有2个相同的ID。如果我只是这样做,那么其他年份的所有其他ID也不会返回,我如何在包含年份和ID的情况下执行此操作?我需要将其移植到crystal语法中,但现在只需关闭SQL查询就可以开始了。@K Ivanov-如果他在这些字段上没有索引,那么会有更大的问题…@Nard Dog-这是您可以使用的逻辑的简化版本。我将添加一个多字段version@Nard狗-编辑为使用不存在,这将导致(2)表扫描,不是非常理想的解决方案可能有2个以上相同的ID,比如说可能有8个,但每年只返回2个相同的ID,因此每年有2个相同的ID。如果我只是这样做,那么其他年份的所有其他ID也不会返回,我如何在包含年份和ID的情况下执行此操作?我需要将其移植到crystal语法中,但现在只需关闭SQL查询就可以开始了。@K Ivanov-如果他在这些字段上没有索引,那么会有更大的问题…@Nard Dog-这是您可以使用的逻辑的简化版本。我将添加一个多字段version@Nard狗-编辑为使用不存在,应该更有效。