2013-08-25 102 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