【问题标题】:How to cross join with out using a table?如何在不使用表的情况下交叉连接?
【发布时间】:2021-12-08 01:41:45
【问题描述】:

最近,我正在尝试创建一个表。我有一列包含“a”、“b”、“c”,并希望将其与 1、2、3 交叉连接到下表中。

但是,我没有包含值 1、2、3 的表,需要在不创建表的情况下进行操作。

我可以在不创建任何表的情况下实现这一点吗?非常感谢!

Col1
a
b
c

Col1 Col2
a   1
b   1
c   1
a   2
b   2
c   2
a   3
b   3
c   3

【问题讨论】:

标签: sql oracle cross-join


【解决方案1】:

改用 CTE:

SQL> with
  2  a (col) as
  3    (select 'a' from dual union all
  4     select 'b' from dual union all
  5     select 'c' from dual
  6    ),
  7  b (col) as
  8    (select 1 from dual union all
  9     select 2 from dual union all
 10     select 3 from dual
 11    )
 12  select a.col, b.col
 13  from a cross join b;

C        COL
- ----------
a          1
a          2
a          3
b          1
b          2
b          3
c          1
c          2
c          3

9 rows selected.

SQL>

【讨论】:

  • 对不起,我知道服务器应该存在表 dual 吗?因为在我的服务器上,我没有包含 1、2、3 的表。谢谢!
  • DUAL 存在于任何 Oracle 数据库中。它归 SYS 所有,但任何人都可以通过公共同义词使用它。
  • 在其他一些 RDBMS 中,您可以在不指定表的情况下进行选择。在 Oracle 中这是不可能的,因此存在 DUAL,它包含单列“DUMMY”并在安装数据库时填充了单行值“X”。
  • 是的,非常感谢我的帮助。抱歉又问了一个问题。如果我想更新这个结果,我该如何实现?非常感谢
  • 对不起,我不明白你的意思。你想如何“更新”这个结果?
【解决方案2】:

你可以使用:

SELECT *
FROM   table1
       CROSS JOIN (SELECT LEVEL AS col2 FROM DUAL CONNECT BY LEVEL <= 3);

WITH data (col1, col2) AS (
  SELECT col1, 1 FROM table1
UNION ALL
  SELECT col1, col2 + 1 FROM data WHERE col2 < 3
)
SELECT * FROM data;

根据您的样本数据:

CREATE TABLE table1 (col1) AS
SELECT 'a' FROM DUAL UNION ALL
SELECT 'b' FROM DUAL UNION ALL
SELECT 'c' FROM DUAL;

两个输出:

COL1 COL2
a 1
b 1
c 1
a 2
b 2
c 2
a 3
b 3
c 3

db小提琴here

【讨论】:

    【解决方案3】:

    您可以通过多种不同方式在查询中创建“表格”,其中一些已在其他答案中进行了说明。

    根据您的要求,我喜欢如下所示的 XML 解决方案:

    create table table1 (col1 varchar2(1));
    insert into table1(col1) values('a');
    insert into table1(col1) values('b');
    insert into table1(col1) values('c');
    commit;
    
    select t1.col1, xmlcast(column_value as number) as col2
    from   table1 t1 cross join xmltable('1 to 3')
    ;
    
    COL1 COL2
    ---- ----
    a       1
    a       2
    a       3
    b       1
    b       2
    b       3
    c       1
    c       2
    c       3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 2022-01-23
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多