【问题标题】:how to ignore where condition results and select remained results in sql server如何忽略条件结果并选择sql server中的剩余结果
【发布时间】:2018-06-13 18:52:57
【问题描述】:

我有一个包含 17 条记录的表。我通过 where 条件选择行,例如以下查询:

SELECT * FROM T1 WHERE (c1='AA' and c3=13)

2 条记录是此查询的结果。 现在我要选择表 T1 的 15 条记录!!! 我在 where 条件之前添加了 not 运算符,例如:

SELECT * FROM T1 WHERE not (c1='AA' and c3=13)

14 条记录是此查询的结果。但该表有 17 条记录 不能使用EXCEPT 子句,因为该子句只选择不同的记录。

【问题讨论】:

  • 您可以发布示例数据吗?
  • 是的。如何发布数据?
  • 将问题中的数据粘贴为文本
  • 很可能在c1c3 列中有null 值。试试isnullnullif 函数。
  • SELECT * FROM T1 WHERE c1<>'AA' and c3<>13)怎么样

标签: mysql sql-server oracle postgresql


【解决方案1】:

如果我使用EXISTS 怎么办?用于 SQL Server

select * from t1 t
where not exists(
         select * from t1 where (t.c1='AA' and t.c3=13)
)

【讨论】:

  • 您的子查询不相关。
  • 没有。这是不正确的,我测试了你的查询,结果是 0 条记录。 w3schools.com/sql/sql_exists.asp 存在返回真或假。如果子查询中仅存在 on rows,则选择所有行。如果不存在,则返回 0 条记录,@Yogesh Sharma
  • @RogerWolf,你知道解决办法吗
【解决方案2】:

如果 Id 重复,则使用 Row_number() 函数。

SELECT T1.* FROM T1 
          LEFT JOIN (SELECT * FROM T1 WHERE (c1='AA' AND c3=13)) AS T2 
            ON(T1.ID=T2.ID) WHERE T2.ID IS NULL; 

【讨论】:

  • 感谢您的解决方案,但 RowNumber() 需要订购,而且需要额外付费
  • 是的,但是我们没有唯一的列,所以在派生表中使用“Row_number()over(order by (select 1))”并加入它们。
  • 你能用 Row_number() 发送一个样本吗,我是新手。
【解决方案3】:

请尝试这样,除了从句

SELECT DISTINCT * FROM 
(
    SELECT * FROM T1
    EXCEPT
    SELECT * FROM T1 WHERE (c1='AA' and c3=13)
)k

【讨论】:

  • 只返回不同的行
  • 更新了解决方案。
  • EXCEPT 返回不同的行,但我想要所有行,而不仅仅是不同的行
【解决方案4】:
  SELECT * FROM t1
               WHERE PrimaryKey_Col not in (
                 SELECT PrimaryKey_Col FROM t1 WHERE t.c1='AA' and t.c3=13
                                           );

注意:这个查询很容易基于 PrimaryKey 工作

【讨论】:

  • 我想要一个通用查询并且一个表可能没有主键
猜你喜欢
  • 2023-03-22
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多