2017-03-14 43 views
0

內部聯接和GROUP BY,我有以下輸出後:SQL - 如何避免集團經過一些記錄通過

Make, Model 
Ferrari, A 
Ferrari, B 
Aston, A 
Opel, A 

我的問題是..如何忽略記錄與使Ferrari查詢的輸出,因爲它包含第二個表(模型)中的多個模型?

PS:第二張表可能包含多條記錄,即使是相同的型號。

我不想只忽略法拉利。我想在相同的情況下忽略所有制造商(表2中超過1個型號)。

目前查詢:

select c.Make, m.Model 
from cars as c 
inner join models as m on c.make = m.make 
where c.year = '2017' 
group by c.Make, m.Model 
+0

示例表的名稱是什麼? '汽車'還是'模型'? – SqlZim

+0

@SqlZim,我想只顯示製作表。 –

+0

@JohnParam不,我的意思是你用一張桌子開始你的問題,然後說出你想用這張桌子做什麼,但是你不要告訴我們你的查詢中有哪張桌子。 – SqlZim

回答

1

使用not exists()

select c.Make, m.Model 
from cars as c 
    inner join models as m 
    on c.make = m.make 
where c.year = '2017' 
    and not exists (
    select 1 
    from cars as i 
    where i.Make = c.Make 
     and i.Model <> c.Model) 
) 
group by c.Make, m.Model 

你可以使用havingcount(distinct c.Model))=1只返回那些具有單一的模式。

select c.Make, m.Model 
from cars as c 
    inner join models as m 
    on c.make = m.make 
where c.year = '2017' 
group by c.Make, m.Model 
having count(distinct c.Model)=1 
+0

有沒有按預期工作。 '有count(distinct c.Model)= 1',我得到了相同的輸出。 –

+1

@JohnParam增加了一個替代方案,它使用'where not exists()'去除那些具有多個'model'的'make'。 – SqlZim

+0

不存在可以正常工作;-) –

0

試試這個...

select c.Make, m.Model 
from cars as c 
inner join models as m on c.make = m.make 
where c.year = '2017' and c.make != 'Ferrari' 
group by c.Make, m.Model 
0

你需要執行某種聚集計數的型號爲每個使號碼。如果你使用的是支持窗口功能的DBMS,那麼你可以用它們做的工作:

select c.make, m.model 
from cars as c 
    inner join (
    select make, model, count(*) over (partition by make) as model_count 
    from model 
) m 
    on c.make = m.make 
where c.year = '2017' and m.model_count = 1 

您不再需要使其彙總查詢(用GROUP BY條款),只要( c.make,c.year)可以被認爲是唯一的,因爲過濾條件將確保沒有出現多次。然而,爲了正確性,這依賴於(model.make,model.model)是唯一的。

注意:我假設你正在執行你真正想要執行的連接。既然你沒有提供表格結構,我沒有其他的東西可以走了。但是,我懷疑這可能不是你真正想要進行的加入。特別是,我想知道你是否真的需要關於哪一個產品在指定年份中只生產一個型號的信息,如果是這樣,那麼看起來你需要更深入的改變才能達到這個目標。