2016-08-03 86 views
2

讓我們假設可用值簡單表找出哪些是不表

Col1 
====== 
one 
two 

讓我們假設下面的簡單查詢

Select count(*) from TABLE_A where Col1 in ('one','two','three','four') 

在上面的查詢會產生以下結果

2 

現在我想知道IN_條件中哪些值在table_A中不可用。

如何找出表中不可用的值?

像下面結果

three 
four 

以上查詢唯一的例子。在我的實時查詢中IN-Condition中有1000個值。

工作數據庫:DB2

+0

如果1000個值'IN'條件,那麼,你可以添加一個表中並存儲所有1000條記錄。然後使用'LEFT JOIN'和'NULL'檢查你可以很容易找到不匹配的記錄 – Arulkumar

+0

@Arulkumar。我已經知道這種方法了。我需要解決任何其他方法。 –

+0

可能是VALUES()的規範的語法替代方法足夠作爲_any other_方法嗎?當這個謂詞是[或有效的;我無法測試非選擇子查詢語法] Col1 in(values('one'),('two'),('three'),('four'))',那麼相同的語法可以用在EXCEPT查詢[或EXCEPTION JOIN對已經提出的LEFT JOIN的類似影響]。 – CRPence

回答

3

這是工作的周圍,實現您的期望之一。

而不是硬編碼IN條件中的值,您可以將這些值移動到一個表中。如果僅使用LEFT JOINNULL檢查,則可以獲得不匹配的值。

SELECT MR.Col1 
FROM MatchingRecords MR -- here MatchingRecords table contains the IN condition values 
LEFT JOIN Table_A TA ON TA.Col1 = MR.Col1 
WHERE TA.Col1 IS NULL; 

Working DEMO

-1

如果值在語句字符串上市,而不是存儲在表中,被用於目前正在由值列表,然後也許是修訂的語法[顯然,來自IN謂詞的其他輸入可能會受到影響?以下修改的值列表語法既可以用於原始聚合查詢[下面顯示的兩個查詢中的第一個],也可以用於查詢如何操作代碼的查詢[第二個下面兩個查詢]:

Select count(*) 
from TABLE_A 
where Col1 in (values('one'),('two'),('three'),('four')) 
; -- report from above query follows: 
COUNT (*) 
      2 


[BGN-編輯05 - 8 - 2016:將這個文本和例子僅低於]
顯然至少一個DB2變體不太願意在派生表未命名列,所以查詢就在列的下方;我選擇了COL1,以便與實際TABLE中的名稱相匹配,但這不應該是必需的。將(col1)添加到原始查詢中,該查詢仍保留在原始的預編輯版本中;該版本仍然是這個編輯\插入後缺少(col1)這裏補充:

select * 
from (values('one'),('two'),('three'),('four')) as x (col1) 
except (select * from table_a) 
; -- report from above query follows: 
COL1 
three 
four 


以下是給原來的查詢,當一些不成文的DB2運行所註釋下方顯示一個未命名列發生故障變體;我應該指出,這個SQL查詢功能,沒有錯誤,在DB2 for我7.1
[最終編輯05 - 8-2016]

select * 
from (values('one'),('two'),('three'),('four')) as x 
except (select * from table_a) 
; -- report from above query follows: 
VALUES 
three 
four 
+0

您的查詢出現錯誤,如「沒有爲'x'的列1指定列名稱」。 @CRPence –

+0

使用IBM i 7.1在IBM DB2 for i SQL上顯示的功能沒有錯誤然而,爲派生表命名列的語法是遵循AS標識符的括號列列表。我將編輯答案以包含該內容 – CRPence