Java DB2中使用INTERSECT的交集

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

我在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
    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,我非常确定。