2013-08-25 99 views
0

试图运行一些DB2查询,但没有得到任何结果。DB2 sql查询运行

SELECT APPLICATION_ID, 
     CLIENT_WRKSTNNAME 
    FROM TABLE(MON_GET_CONNECTION(cast(NULL as bigint), -2)) AS t 
WHERE APPLICATION_ID IN (SELECT ''''||APPLICATION_ID||'''' 
          FROM SYSIBM.SYSDUMMY1) 

问题出在WHERE子句中的子查询中。如果我只运行

SELECT ''''||APPLICATION_ID||'''' 
    FROM SYSIBM.SYSDUMMY1 

部分并将结果复制/粘贴到大查询 - 我会得到需要的结果。子查询的结果如下所示:'92.81.111.13.51632.13022516453',它必须是String/varchar。

我在做什么错?

回答

0

您的查询没有意义。下面是表的别名版本:

SELECT t.APPLICATION_ID, t.CLIENT_WRKSTNNAME 
    FROM TABLE(MON_GET_CONNECTION(cast(NULL as bigint), -2)) AS t 
WHERE t.APPLICATION_ID IN (SELECT ''''||t.APPLICATION_ID||'''' FROM SYSIBM.SYSDUMMY1); 

一种可能性是,现场APPLICATION_ID正在与自己相比,用引号。 SYSIBM.SYSDUMMY1没有名为APPLICATION_ID的列。因此,此查询相当于:

SELECT t.APPLICATION_ID, t.CLIENT_WRKSTNNAME 
    FROM TABLE(MON_GET_CONNECTION(cast(NULL as bigint), -2)) AS t 
WHERE t.APPLICATION_ID = ''''||t.APPLICATION_ID||'''' ; 

另一种可能性是APPLICATION_ID是一个变量。在这种情况下,您应该将变量命名为v_APPLICATION_ID,以免与列名称混淆。

它看起来像你想要的东西,如:

WHERE '.'||t.APPLICATION_ID||'.' like '%.'||v_APPLICATION_IDS||'.%' ; 

这是假设在v_APPLICATION_IDS列表是由句点分隔。通常,它将用逗号分隔,您将使用','而不是'.'

+0

这是不同的APPLICATION_ID在这里:'SELECT''''|| APPLICATION_ID ||''''FROM SYSIBM.SYSDUMMY1',而不是t.APPLICATION_ID。 SYSIBM.SYSDUMMY1(dummy表)中的APPLICATION_ID和select中的APPLICATION_ID来自t。 –

+0

@udar_molota。 。 。我不知道您使用的是哪个版本的DB2,但在我知道的所有版本中,该表没有名为“APPLICATION_ID”的字段(请参阅http://pic.dhe.ibm.com/infocenter/dzichelp /v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.sqlref%2Fsrc%2Ftpc%2Fdb2z_sysibmsysdummy1table.htm)。因此,该查询将解析来自外部作用域的字段,该作用域具有别名“t”。 –

+0

你几乎是正确的。 'MON_GET_CONNECTION'是一个表FUNCTION,SYSIBM.SYSDUMMY1是虚表。我使用9.7,我的问题的正确答案如下。 –

0
WITH s AS (SELECT APPLICATION_ID AS application_id FROM SYSIBM.SYSDUMMY1) 
SELECT CLIENT_WRKSTNNAME 
FROM TABLE(MON_GET_CONNECTION(cast(NULL as bigint), -2)) AS t 
INNER join s as s on s.application_id=t.APPLICATION_ID