的門票表
標準彙總(亞)查詢,隨後加入,以獲得客戶名稱:
with
customer (id, name, address) as (
select 1, 'Manoj', 'Japan' from dual union all
select 2, 'Sunil', 'US' from dual
),
tickets (id, customerid, ticketstatus) as (
select 1, 1, 'closed' from dual union all
select 2, 1, 'closed' from dual union all
select 3, 2, 'closed' from dual union all
select 4, 1, 'open' from dual union all
select 5, 2, 'closed' from dual
)
-- END of test data (not part of the solution!)
-- SQL query begins BELOW THIS LINE
select s.id, c.name, 'closed' as ticketstatus
from (
select customerid as id
from tickets
group by customerid
having min(ticketstatus) = 'closed'
and max(ticketstatus) = 'closed'
) s
join customer c
on s.id = c.id
;
ID NAME TICKETSTATUS
-- ----- ------------
2 Sunil closed
這是假設ticketstatus
不能NULL
- 否則一些必須小心,因爲min()
和max()
忽略空值。
這樣會得到根本沒有任何門票的顧客。 –
「不需要加入」是不完全正確的,因爲NOT IN條件是一種連接形式(特別是ANTI-JOIN)。雖然這種形式確實比「標準」加入要便宜。然後:如果狀態永遠不能爲NULL,那麼NOT IN條件沒問題;如果它可以是NULL,那麼必須更加小心。 – mathguy
mathguy,感謝您對('NOT')'IN'和各種類型的連接的有趣評論。我從來沒有真的這樣想過。另外,我同意你關於潛在的'NULL'問題的評論,儘管在這種情況下,我認爲'customerid'永遠不會有'NULL'值。 – toonice