Java DB2中使用INTERSECT的交集
我在DB2中有一个查询,需要对其进行交集Java DB2中使用INTERSECT的交集,java,db2,db2-luw,intersect,Java,Db2,Db2 Luw,Intersect,我在DB2中有一个查询,需要对其进行交集 SELECT * FROM records where id = 1 intersect SELECT * FROM records where id = 2 现在,ID的大小可以动态增长,DB2中是否有任何东西可以将ID列表作为参数?差不多 在1,2,3,4,5中交叉,以便使用单个查询()可以考虑这些ID上的结果集的交集,可以创建一个带有ID列表的表,然后创建一个程序来创建SQL语句以执行。 大概是这样的: CREATE PROCEDURE
SELECT * FROM records where id = 1
intersect
SELECT * FROM records where id = 2
现在,ID的大小可以动态增长,DB2中是否有任何东西可以将ID列表作为参数?差不多
在1,2,3,4,5中交叉,以便使用单个查询()可以考虑这些ID上的结果集的交集,可以创建一个带有ID列表的表,然后创建一个程序来创建SQL语句以执行。 大概是这样的:
CREATE PROCEDURE
YOUR_PROCEDURE
(
)
LANGUAGE SQL
SPECIFIC YOUR_PROCEDURE
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
INHERIT SPECIAL REGISTERS
SET OPTION
ALWBLK = *ALLREAD ,
ALWCPYDTA = *YES ,
COMMIT = *NONE ,
CLOSQLCSR = *ENDMOD ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DLYPRP = *NO ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX ,
OUTPUT = *PRINT,
DBGVIEW = *SOURCE
BEGIN
DECLARE LAST_ELEMENT SMALLINT DEFAULT 0 ;
DECLARE FIRST_ELEMENT SMALLINT DEFAULT 1 ;
DECLARE STMT VARCHAR ( 5000 ) ;
DECLARE ID_CODE_TO_USE NUMERIC (9 , 0) ;
DECLARE ID_LIST CURSOR FOR
SELECT
ID_CODE
FROM
YOUR_TEMPORARY_TABLE ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET LAST_ELEMENT = -1 ;
OPEN ID_LIST ;
SET STMT = '' ;
SET FIRST_ELEMENT = 1 ;
FETCH_ID_LIST:
LOOP
FETCH ID_LIST
INTO
ID_CODE_TO_USE ;
-------
IF LAST_ELEMENT = -1 THEN
LEAVE FETCH_ID_LIST ;
END IF ;
-------
IF FIRST_ELEMENT= 1 THEN
SET STMT = 'SELECT * FROM RECORD WHERE ID = ' CONCAT CHAR(ID_CODE_TO_USE)
SET FIRST_ELEMENT = 0 ;
END IF ;
-------
SET STMT = 'INTERSECT SELECT * FROM RECORD WHERE ID = ' CONCAT CHAR(ID_CODE_TO_USE)
END LOOP FETCH_ID_LIST;
CLOSE ID_LIST ;
IF STMT <> '' THEN
EXECUTE IMMEDIATE STMT ;
END IF ;
END ;
按原样运行:
with ids (id) as
(
select id
from xmltable
(
'for $id in tokenize($s, ",") return <i>{string($id)}</i>'
-- the following string of IDs may be passed as a parameter
passing '1,2,3' as "s"
columns id int path 'if (. castable as xs:integer) then xs:integer(.) else ()'
)
)
, tab (id, c1, c2) as
(
values
(1, 1, 1)
, (1, 1, 1)
, (2, 1, 1)
, (2, 1, 1)
, (3, 1, 1)
, (1, 2, 2)
, (2, 2, 2)
)
select t.c1, t.c2
from tab t
join ids i on i.id=t.id
group by t.c1, t.c2
having count(distinct t.id) = (select count(1) from ids);
C1 C2
-- --
1 1
如果这不是您想要的,那么提供一些源数据示例和所需的确切结果。什么平台和版本的Db2?@data\u henrik Db2 v 9.7.200您可以在简单情况下使用CTE。否则,请考虑将ID列表放入一个会话表中,如果合理的话,可以动态地索引,并与之相交。@ dayalSaleDelo,您所提供的查询不能返回非空结果集——ID列在所有子集中都有不同的值,并且必须将其从选择列表中排除。我们确实能够将字符串(如1,2,3)转换为整数列表。解决方案是:将records表连接到此整数列表,按需要提供此类列表的相交列列表分组,其中不包括具有countdistinct id=长度的id列。如果这是您真正需要的,我可以提供一个示例。系统正在生产中,这是一个转折点,而且会很繁忙,我可以使用代码动态创建query。我只是想知道DB2是否提供了任何东西。不,我认为您必须以友好的方式创建SQL,我非常确定。