Informix SQL 11.5 按列将一个选择的结果附加到另一个选择

Posted

技术标签:

【中文标题】Informix SQL 11.5 按列将一个选择的结果附加到另一个选择【英文标题】:Informix SQL 11.5 Attach the result of one select to another select by columns 【发布时间】:2020-09-19 09:59:56 【问题描述】:

我有一个选择:

select c1,c2,c3 from table1 where cond1

--result:

  a  b  c
  d  e  f
  g  h  i 

另一个选择是

从表2中选择m2,其中cond2

--result:

 x
 y
 z

我可以用这个输出实现这两者的什么组合?

select m2 from table2 where cond2 **COMBIN**  select c1,c2,c3 from table1 where cond1

--result

x  a  b  c
y  d  e  f
z  d  e  f

当然,union 和 join 不像 COMBIN 那样起作用。

【问题讨论】:

我想你想让第一个与第一行,第二个与第二个,第三个与第三行。现在这不可能了。数据库表行无序;通常,选择不会保证行在两个相同的查询中以相同的顺序出现。两边都需要一个排序列 @marcothesane : 如果我们忽略排序有没有解决办法? 只需向两个表添加一个公共列并通过该列连接它们:从 t1,t2 中选择 t2.c1, t1.c1,t1.c2,t1.c3 where t1.common=t2。常见的; @jsagrera 表之间没有公共列 那么我怀疑你可以在单个 SQL 语句中做到这一点。您可以使用从两个表中获取的函数/过程并一次返回刚刚连接的行来完成 【参考方案1】:

您可以使用 SPL/Function 来实现。 比如:

--drop procedure p1 ();
create procedure p1 () returning char AS t2_c1,char AS t1_c1,char AS t1_c2,char AS t1_c3;

   define t1_c1 char;
   define t1_c2 char;
   define t1_c3 char;  
   define t2_c1 char;
      
   prepare t1_id from "select c1,c2,c3 from t1";
   prepare t2_id from "select c1 from t2";
   declare t1_cur cursor for t1_id;
   declare t2_cur cursor for t2_id;
   open t1_cur;
   open t2_cur;
   
   while (1=1)   
    fetch t1_cur into t1_c1,t1_c2,t1_c3; 
    if (sqlcode == 100)  then
           exit;
    end if 
    fetch t2_cur into t2_c1; 
    if (sqlcode == 100)  then
           exit;
    end if      
    return t2_c1,t1_c1,t1_c2,t1_c3 with resume;    
   end while   

   close t1_cur;   
   close t2_cur;
   free t1_cur ;   
   free t2_cur ;
   free t1_id ;
   free t2_id ;
end procedure;

execute procedure p1();

应该给你的:

D:\Infx\ids1410>dbaccess stores7 p
Database selected.
Routine dropped.
Routine created.

t2_c1 t1_c1 t1_c2 t1_c3

x     a     b     c
y     d     e     f
z     g     h     i

3 row(s) retrieved.
Database closed.
D:\Infx\ids1410>

但如果你有一个共同的列会简单得多;)

【讨论】:

【参考方案2】:

好吧 - 让我们使用ROW_NUMBER() OLAP 函数手工制作一个通用列,然后通过它加入...

WITH
-- your input
table1(c1,c2,c3) AS (
          SELECT 'a','b','c'
UNION ALL SELECT 'd','e','f'
UNION ALL SELECT 'g','h','i'
)
,
-- your input
table2(m2) AS (
          SELECT 'x'
UNION ALL SELECT 'y'
UNION ALL SELECT 'z'
)
-- real query starts here, replace "," with "WITH"
,
tb1_w_id AS (
  SELECT
    ROW_NUMBER() OVER(ORDER BY c1) AS id
  , *
  FROM table1
  WHERE true
)
,
tb2_w_id AS (
  SELECT
    ROW_NUMBER() OVER(ORDER BY m2) AS id
  , *
  FROM table2
  WHERE true
)
SELECT
  m2
, c1
, c2
, c3
FROM tb1_w_id
JOIN tb2_w_id ON tb1_w_id.id = tb2_w_id.id
;
-- out  m2 | c1 | c2 | c3 
-- out ----+----+----+----
-- out  x  | a  | b  | c
-- out  y  | d  | e  | f
-- out  z  | g  | h  | i

【讨论】:

正如最初在另一个建议使用 ROW_NUMBER 等 OLAP 函数的答案中指出的那样,Informix 11.50(一段时间不支持)不支持 OLAP(窗口化)函数。 11.70 版也将在 2020 年 9 月结束时停止支持。 11.70、12.10 和 14.10 版本确实支持窗口函数 IIRC。我同意,如果 Informix 的版本支持该表示法,那将是实现结果的一种方式。

以上是关于Informix SQL 11.5 按列将一个选择的结果附加到另一个选择的主要内容,如果未能解决你的问题,请参考以下文章

Informix SQL 11.5 — 在 while 循环中访问变量

Informix SQL 11.5 创建没有临时表的存储过程

Informix SQL 11.5 将查询结果存储在具有动态名称的文件中

Pandas 按列将 CSV 拆分为多个 CSV(或 DataFrame)

pyspark 按列将数据帧拆分为几个数据帧

在matlab中按列将数据或值附加到csv文件