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 将查询结果存储在具有动态名称的文件中