【问题标题】:SQL Server - all possible combinations of Bit columnsSQL Server - 位列的所有可能组合
【发布时间】:2020-01-29 16:24:44
【问题描述】:

我有一个包含 7 位列(A、B、C、D、E、F 和 G)的空表。我希望用代表这些列的所有可能组合的行填充此表。理想情况下,不会有包含完全相同组合重复的行。虽然我在这里展示了 7 列,但列的数量可能会更多,因此解决方案应该是可扩展的。

填充后的表的 sn-p 如下所示:

理想情况下,这将基于 INSERT 语句,但我也愿意接受 T-SQL 循环解决方案。我曾尝试使用 CROSS JOINS,但我有限的知识并没有让我走得很远。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql combinations sql-insert


    【解决方案1】:

    使用 CTE 和 CROSS JOIN 它本身 7 次,如:

    with bits as (select 0 as bit union select 1)
    select
      row_number() over(
        order by a.bit, b.bit, c.bit, d.bit, e.bit, f.bit, g.bit) as id,
      a.bit, b.bit, c.bit, d.bit, e.bit, f.bit, g.bit
    from bits a
    cross join bits b
    cross join bits c
    cross join bits d
    cross join bits e
    cross join bits f
    cross join bits g
    

    【讨论】:

      【解决方案2】:

      您可以使用以下查询

      ;with bits as (select * from (values(0),(1)) as bits(d))
      select *
      from
          bits as b1,
          bits as b2,
          bits as b3,
          bits as b4,
          bits as b5,
          bits as b6,
          bits as b7
      

      【讨论】:

      • 这可行,但您应该真正使用现代连接语法,自 SQL-92 起可用。
      • 对于这样的事情,@TheImpaler 并不是真的需要。像这样的东西(并创建一个计数)大约是唯一一次我会说逗号分隔是可以的。特别是作为逗号分隔的表列表是CROSS JOIN,这正是我们想要的(不是隐含的INNER JOIN)。每一行都没有CROSS JOIN 实际上使声明更加简洁。
      • @Larnu 我想我正在反对旧加入。我不知道;)
      • 我同意,它们几乎不应该被使用,@TheImpaler,但是使用旧式交叉连接来创建交叉连接和简洁的代码,并不是一件坏事(在我看来) . ;)
      【解决方案3】:

      你可以用递归来做到这一点。

      我知道,这个解决方案的性能不如前一个,因为它可以实现所有可能的排列

      但至少,它的优势在于它可以在排列数上进行扩展

      declare @mytable as table (s varchar(10))
      insert into @mytable values('1'),('0');
      
      with cte as(
      select 0 as perm,cast(s as varchar(10)) s from @mytable
      union all
      select perm+1,cast(t1.s+t2.s as varchar(10)) from cte t1 inner join @mytable t2 on 1=1
      where perm <=7)
      select * from cte where perm=7 order by s
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多