【问题标题】:SQL Query to get two values from a table in same result rowSQL查询从同一结果行中的表中获取两个值
【发布时间】:2021-10-07 08:37:23
【问题描述】:

我有一个表,其中包含一个始终以 AB(唯一)开头的标识符和一个键值(非唯一)

ID       Key
------------------
AB1234   10001
28376    10001
AB5678   10002
7180     10002

我需要能够查询并获取每个 Key 值的单行结果。每个键总是只有两个不同的 ID 值,所以我需要以下结果:

ID1      ID2      Key
----------------------------
AB1234   28376    10001
AB5678   7180     10002

我什至不确定这是否可能

【问题讨论】:

  • “每个键一行”在 SQL 中转换为 GROUP BY key。每个键有两个值,您可以使用MINMAX 轻松获得。每个键三个值会更困难:-)

标签: sql database oracle


【解决方案1】:

每个键总是只有两个不同的 ID 值

在这种情况下,可能会执行以下操作(第 1 - 6 行中的示例数据;查询从第 7 行开始):

SQL> with test (id, key) as
  2    (select 'AB1234', 10001 from dual union all
  3     select '1234'  , 10001 from dual union all
  4     select 'CD5678', 10002 from dual union all
  5     select '5678'  , 10002 from dual
  6    )
  7  select min(id) id1,
  8         max(id) id2,
  9         key
 10  from test
 11  group by key;

ID1    ID2           KEY
------ ------ ----------
5678   CD5678      10002
1234   AB1234      10001

SQL>

【讨论】:

    【解决方案2】:

    可以通过下面提到的方式完成。如果您可以确认 ID2 始终与 ID1 的子字符串相同并且位置保持不变。下面提到的是这个的代码

    Select id as ID1, substr(id,3,6) as ID2, key
    from <table_name> where len(id)=6
    group by 3
    

    【讨论】:

    • 很遗憾没有。这些只是虚拟值,所以 ID1 可能是 AB1234,ID2 很容易是 6109
    【解决方案3】:

    那就试试这个

    with cte as (Select id as id1, key from <table_name> where len(id)=6),
    cte2 as (select id as id2, key from <table_name> where len(id)=4)
    select cte.id1, cte2.id2, cte.key from cte join cte2 on cte.key=cte2.key
    group by 3
    

    【讨论】:

    • 再次抱歉,值可以是不同的长度,因此基于长度的查询将不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多