2013-03-04 63 views
2

我有三個Oracle數據庫表。我將創建一個人爲的例子,使其更容易一些:如何爲具有相同值的組查詢SQL

獸醫的表..

vid   name 
1   Bob 
2   Sally 
3   Sue 
4   Henry 

專業

spid Animal 

1  Dogs 
2  Cats 
3  Mice 
4  Kangaroos 
5  Koala Bears 

廣告

id  vid spid    Ad venue 

1  1  1     TV ads 
2  1  2     TV ads 
3  1  2     Magazine ads 
4  2  1     TV ads 
5  2  1     On line ads 
6  3  5     TV ads 
7  4  5     Magazine ads 

我會就像爲每個專業獲得前3名獸醫的結果集,這些獸醫只宣傳一種專業。對於某些專業來說,NO vet可能只是宣傳那一種專業。 '獸醫'表有大約30,000行。 Specialties表只有10行。 廣告桌有大約100,000行。我知道如何進行查詢和連接,但不知道如何查找組中所有相同的行。

所以我在尋找的輸出是這樣的:

Dogs   null 
Cats   Sally 
Mice   null 
Kangaroos  null 
Koala Bears Sue, Henry 

回答

2
select 
    max(animal) as animal, 
    listagg(name, ', ') within group (order by name) as vet_list 
from 
    Specialties 
    left join (
     select 
     vid, 
     max(spid) as spid, 
     row_number() over(partition by max(spid) order by null) rn 
     from Advertising 
     group by vid 
     having count(distinct spid) = 1 
    ) using(spid) 
    left join veterinarians using(vid) 
where lnnvl(rn > 3) 
group by spid 
order by spid 

fiddle

+0

非常感謝您的工作!非常感激。 – Leonard 2013-03-04 18:58:28

1

這給你誰只公告1專業

SELECT vid 
FROM advertising 
GROUP BY vid 
HAVING COUNT(*)=1 

這給大家,每個類別1個專業的獸醫的獸醫

SELECT s.Animal, v.name 
FROM Specialties s 
    LEFT JOIN 
    advertising a ON s.spid=a.spid 
    LEFT JOIN 
    veterinarians v ON a.vid=v.vid 
WHERE a.vid IN (SELECT vid 
       FROM advertising 
       GROUP BY vid 
       HAVING COUNT(*)=1) 

現在,您尚未在此上下文中指定「第一」的含義 - 按字母順序,由身份證,別的東西?當你決定時,你可以通過這個進行分區。

+0

有趣和有用的開始。謝謝。儘管如此,它並沒有讓我在我想要的地方。條件計數(*)= 1只在他們僅在1個媒體上投放廣告時纔會成立,如果我正確閱讀此內容。如果在電視和雜誌上刊登相同的專業(袋鼠),他們將不會被發現。 – Leonard 2013-03-04 03:13:59

0

嘗試以下操作: -

select vid 
from (select distinct vid, spid 
from advertising) 
group by vid 
having count(*) = 1; 

上述會給你所有那些只有1個專業獸醫的列表。要獲得相應的專業列表,執行以下命令: -

select * from 
(select s.spid,s.animal, a.vid,v.name,row_number() over (partition by s.spid order by a.vid) rn 
from specialities s inner join advertising a 
on s.spid=a.spid 
inner join vets v 
on a.vid=v.vid 
and v.vid in (select vid 
    from (select distinct vid, spid 
    from advertising) 
    group by vid 
    having count(*) = 1) 
order by s.spid 
) 
where rn <= 3; 

以上將不顯示了應有空輸出的專科(根據你的例子)。爲了得到這個列表,將最後一個內部聯接轉換爲一個左外部聯接。

+0

我收到以下錯誤:ORA-30485:缺少窗口規範中的ORDER BY表達式 30485. 00000 - 「窗口規範中缺少ORDER BY表達式」 *原因:或者ORDER BY表達式對於此函數是必需的,或者 有一個聚合組沒有ORDER按表達式。 *操作: 錯誤在行:18列:31 – Leonard 2013-03-04 04:21:46

+0

更新了代碼 – Max 2013-03-04 15:17:20

+0

感謝您的工作。對此,我真的非常感激。我仍然有錯誤必須與實際選擇* ...聲稱它是模糊的。當我嘗試其他選擇元素時,也出現了「模棱兩可」。但是,再次感謝。 – Leonard 2013-03-04 19:00:09

相關問題