【问题标题】:How to select all columns where a set of them are distinct in SQL Server 2008 r2如何选择 SQL Server 2008 r2 中一组不同的所有列
【发布时间】:2014-12-23 03:26:16
【问题描述】:

我在一个 sql 表中有一堆列,我想将该表的每个字段插入到一个临时表中,其中一组列是不同的。换句话说,假设我有一个包含 a、b、c、d、e、f 和 g 列的表。如何选择 a、b 和 c 不同的每一行?

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文? (“SQL”不是 DBMS 产品,它是查询语言)
  • 与什么不同?彼此或与所有其他行相比?
  • 取决于您所说的“不同”:distinct 关键字、正确的 group by 语句或正确的 where 语句可能会涵盖您。
  • @SeanSmyth 好的,那么 Gordon 似乎在下面介绍了你 :)
  • 请添加一些示例数据和基于该示例数据的预期输出。

标签: sql sql-server select sql-server-2008-r2 distinct


【解决方案1】:

鉴于对 Gordon 回答的评论,我相信这应该对您有用:

select * 
from table as main
    inner join (
        select a, b, c, count(*)
        from table
        group by a, b, c
        having count(*) = 1
    ) as sub
        on main.a = sub.a
        and main.b = sub.b
        and main.c = sub.c

【讨论】:

    【解决方案2】:

    假设您没有 NULL 值,您只需执行 where 子句中的逻辑:

    select t.*
    from table t
    where a <> b and a <> c and b <> c;
    

    编辑:

    对于您修改后的问题,解决方案可能是:

    select t.*
    from (select t.*, count(*) over (partition by a, b, c) as cnt
          from table t
         ) t
    where cnt = 1;
    

    【讨论】:

    • +1 应该可以,但number vs string 比较失败?一般来说,跨数据类型..
    • 这不是我想要的。我的意思是,我有 a-g 列,我希望每一行集合 a、b、c 都不同于其他所有 a、b、c 集合
    【解决方案3】:

    您可以使用 COUNT(),按 a、b 和 c 进行分区;

    WITH cte AS (
      SELECT *, COUNT(1) OVER (PARTITION BY a, b, c) cnt FROM mytable
    )
    SELECT a, b, c, d, e, f, g FROM cte WHERE cnt=1;
    

    这将 - 对于每一行 - 计算具有相同 a/b/c 组合的行数,并返回“唯一”的完整行(即计数为 1)

    【讨论】:

      【解决方案4】:

      所以最后,修复很简单。

      select a, b, c, max(d) as d, max(e) as e, ...... max(g) as g into #temp
      from MyTable
      group by a, b, c
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 1970-01-01
        相关资源
        最近更新 更多