2015-08-13 60 views
4

我有一個交易列表,我需要檢查它們是否存在於我的DEALS表中,並且對於每個現有交易,從該表中顯示其屬性。如何顯示不存在的記錄?

我使用的查詢:

select * from deals 
where run_id = 2550 
and deal_id 
in ('4385601', '4385602', ...); 

不過,我也想知道哪些交易並不在該表存在。我怎樣才能做到這一點?

+0

這是無數的非現有交易。你真的想讓他們回來嗎? – jarlh

回答

2

有一個單獨的查找表中所有的dealsids並使用這個

select t2.*, 
case when t1.deal_id is null then 'do not exist' else 'exists' end as status 
from lookup_table as t1 left join deals as t2 
on t1.deal_id=t2.deal_id 
and t1.deal_id and t2.run_id = 2550 
where ('4385601', '4385602', ...) 
; 
+0

你需要另一種方式。 'lookup_table LEFT JOIN交易'。正如你現在寫的,你*仍然*只得到一個交易結果行,存在於'交易'表中。 – MatBailie

+0

是的。我編輯了我的帖子。謝謝 – Madhivanan

+0

哦,'run_id = 2550'需要移動到JOIN,否則你會過濾掉所有'不存在的行'*(因爲在你處於WHERE子句時run_id將爲NULL )*。 – MatBailie

-1

另一種方式: -

SELECT A.*, 
    'Exist' 
FROM DEALS A 
WHERE A.RUN_ID = 2550 
AND A.DEAL_ID IN ('4385601', '4385602',...) 
UNION 
SELECT B.*, 
    'Not Exist' 
FROM DEALS B 
WHERE B.RUN_ID  = 2550 
AND B.DEAL_ID NOT IN ('4385601', '4385602',...); 
+0

如果沒有行,其中'RUN_ID = 2550 AND DEAL_ID ='4385601',這將不會返回一行說明它不存在。 – MatBailie

+0

是的,在這種情況下,不需要'B.RUN_ID = 2550'。但是如果OP想要輸出這個特定的run_id,那麼它將會很有幫助。 –

+1

使用這個例子,OP想知道如果'DEALS'表中不存在交易'4385601'。你的查詢確實沒有做到這一點。舉一個簡單的例子;具有兩行值「1」和「2」的表格。然後你查詢'值IN(0,1)'並將它與'NOT NOT(0,1)'值合併。第1行在列表中,因此顯示爲EXIST。第2行不在列表中,因此會顯示爲NOT EXIST。但是永遠不會有結果說0值不存在。你的'NOT EXIST'測試是'表中所有不在IN子句中的行',但OP希望'IN子句中不在表中的所有值' – MatBailie

1

簡短的回答是,你不能。任何結果行必須來自某處存在的行。

所以,答案是創建一個有你想檢查的完整列表的地方。如果你能有一個真正的永久表,列出每一個有效的交易,那麼這是很簡單的......

SELECT 
    all_possible_deals.deal_id 
FROM 
    all_possible_deals 
LEFT JOIN 
    deals 
     ON deals.run_id = 2550 
     ON deals.deal_id = all_possible_deals.deal_id 
WHERE 
    deals.deal_id IS NULL -- This is NULL if it exists in [all_possible_deals], but not in [deals] 

但它可能是不實際的(甚至可能)來創建和/或維護這樣的表。

在這種情況下,你可以使用內嵌視圖,而不是你IN (?,?,?)條款,並以此作爲你的模板上左加盟。

SELECT 
    all_possible_deals.deal_id 
FROM 
(
    SELECT '4385601' AS deal_id FROM dual 
    UNION ALL 
    SELECT '4385602' AS deal_id FROM dual 
    UNION ALL 
    SELECT '4385603' AS deal_id FROM dual 
) 
    all_possible_deals 
LEFT JOIN 
    deals 
     ON deals.run_id = 2550 
     ON deals.deal_id = all_possible_deals.deal_id 
WHERE 
    deals.deal_id IS NULL -- This is NULL if it exists in [all_possible_deals], but not in [deals] 

這涉及到的代碼編程生成UNION ALL塊一點點,但它確實在功能上你問。


無論哪種方式,其原理是總是將是相同的。

您可以使用LEFT JOIN並檢查未命中(NULL檢查),找到tableA中的內容,但不是tableB中的內容。

但是SQL不能創建rows that are not there,所以你LEFT JOIN上必須表包含潛在現有/缺失值的完整列表。