【问题标题】:How to create a hash of all possible combinations in SQL or Java?如何在 SQL 或 Java 中创建所有可能组合的哈希?
【发布时间】:2012-06-07 18:11:42
【问题描述】:

我有一个简单的查询:

select key, name from cities

这给了我这样的价值观:

11 | Chicago
21 | New York
31 | Boston

我需要做的是在 SQL 或 Java 中创建所有可能组合的哈希,以便在最后收到此结果:

11 | Chicago
21 | New York
31 | Boston
32 | Chicago/New York
42 | Chicago/Boston
52 | New York/Boston
63 | Chicago/New York/Boston

有什么想法吗?

【问题讨论】:

  • 为什么您的预期输出与所有三个城市都没有一行?如果键值之和不唯一怎么办?
  • 你说得对,我刚刚添加了三个城市的最后一个结果。我知道,钥匙永远是独一无二的。
  • “创建哈希”是什么意思?术语“哈希”有多种含义(我责怪 Perl),具体取决于上下文,这里并不完全清楚......
  • 对不起,我猜 hash 不是正确的描述。它更像是一个地图,其中 11、21 等是键,城市名称是值。
  • 为什么芝加哥/纽约是 33 而不是 32?当两个组合加起来为同一个键时,一般情况下会发生什么? Java Hash 不能保存重复的键。

标签: java sql oracle


【解决方案1】:

这并不完美,但可能是一个开始:

首先我创建了一个函数:

create or replace function sum_string(str in varchar2) return number is
  Result number;
begin
  execute immediate 'select ' || str || ' from dual'
    into result;
  return(Result);
end sum_string;
/

然后是查询(your_table 是您的表)

with jwt as  (
  select t1.key k1, t1.name n1, t2.key k2, t2.name n2, t1.key + t2.key jkey
    from your_table t1
    left outer join (select key, name
                       from your_table
                     union all
                     select 0 "key", null "name" from dual) t2 on t1.key <>
                                                                  t2.key
  )
select jkey, max(aaa.pth)
  from (select sys_connect_by_path(t.n1, '/') pth,
               sum_string(ltrim(sys_connect_by_path(t.k1, '+'), '+')) jkey
          from jwt t
         start with t.k2 = 0
        connect by nocycle prior k1 = k2) aaa
 group by jkey;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-22
    • 2012-04-04
    • 2017-10-04
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多