我有一個交易列表,我需要檢查它們是否存在於我的DEALS
表中,並且對於每個現有交易,從該表中顯示其屬性。如何顯示不存在的記錄?
我使用的查詢:
select * from deals
where run_id = 2550
and deal_id
in ('4385601', '4385602', ...);
不過,我也想知道哪些交易並不在該表存在。我怎樣才能做到這一點?
我有一個交易列表,我需要檢查它們是否存在於我的DEALS
表中,並且對於每個現有交易,從該表中顯示其屬性。如何顯示不存在的記錄?
我使用的查詢:
select * from deals
where run_id = 2550
and deal_id
in ('4385601', '4385602', ...);
不過,我也想知道哪些交易並不在該表存在。我怎樣才能做到這一點?
有一個單獨的查找表中所有的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', ...)
;
你需要另一種方式。 'lookup_table LEFT JOIN交易'。正如你現在寫的,你*仍然*只得到一個交易結果行,存在於'交易'表中。 – MatBailie
是的。我編輯了我的帖子。謝謝 – Madhivanan
哦,'run_id = 2550'需要移動到JOIN,否則你會過濾掉所有'不存在的行'*(因爲在你處於WHERE子句時run_id將爲NULL )*。 – MatBailie
另一種方式: -
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',...);
如果沒有行,其中'RUN_ID = 2550 AND DEAL_ID ='4385601',這將不會返回一行說明它不存在。 – MatBailie
是的,在這種情況下,不需要'B.RUN_ID = 2550'。但是如果OP想要輸出這個特定的run_id,那麼它將會很有幫助。 –
使用這個例子,OP想知道如果'DEALS'表中不存在交易'4385601'。你的查詢確實沒有做到這一點。舉一個簡單的例子;具有兩行值「1」和「2」的表格。然後你查詢'值IN(0,1)'並將它與'NOT NOT(0,1)'值合併。第1行在列表中,因此顯示爲EXIST。第2行不在列表中,因此會顯示爲NOT EXIST。但是永遠不會有結果說0值不存在。你的'NOT EXIST'測試是'表中所有不在IN子句中的行',但OP希望'IN子句中不在表中的所有值' – MatBailie
簡短的回答是,你不能。任何結果行必須來自某處存在的行。
所以,答案是創建一個有你想檢查的完整列表的地方。如果你能有一個真正的永久表,列出每一個有效的交易,那麼這是很簡單的......
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上必須表包含潛在現有/缺失值的完整列表。
這是無數的非現有交易。你真的想讓他們回來嗎? – jarlh