2015-06-15 25 views
2

對不起,因爲它不是非常definientia。我有2個表,一個商店的人的數據和一個儲存主題數據與感興趣的人一起。兩個表看起來像下面讓人對更多主題感興趣 - Sql Server

Id Name 
1 Imad 
2 Sumeet 
3 Suresh 
4 Navin 

主題

Id PId Subject 
1 1 DC 
2 1 DS 
3 3 DS 
4 4 CA 

PId是一個人的身份證

我需要讓所有感興趣的學生最大受試者數量,例如Imad在這裏。

這裏是我的查詢

With c as 
(
    select Pid, count(Id) as 'Total' from subjects group by Pid 
) 
select Pid into #Temp from c where Total = (Select Max(Total) from c) 
select * from Person where Id in (Select Pid from #Temp) 

它給了我想要的輸出,但每當這種類型的問題是問在採訪中,我從來沒有得到面試官良好的反應,因爲他們總是期待更好的解決方案。我對我的SQL技能沒有信心,這就是爲什麼我認爲必須有更高效的解決方案,因此我在這裏發佈了它。 感謝

+0

研究你的SQL。您不需要像這樣的查詢的臨時表。 –

+0

我同意,但不知道其他方式。 – Imad

+1

Tid?學科 ?那些是不存在的對象 –

回答

5

簡單地對數據進行排序,並得到最上面的一個記錄與領帶(這意味着如果一些學生有平等的罪名,他們兩者都會得出結果):

select top 1 with ties p.Id, p.Name 
from Subjects s 
join Person p on s.PId = p.Id 
group by p.Id, p.Name, 
order by count(*) desc 
+1

至少2008 R2支持。 –

+1

我檢查過,甚至2005年的支持。 https://msdn.microsoft.com/en-us/library/ms189463(v=sql.90).aspx –

+0

我愛與關係的伎倆。 –

1

你可以試試這個:

;With c as 
(
    select Pid, count(Id) as 'Total' from subject group by Pid 
) 

select * from Person join c on c.Pid=Person.Id where c.total>1 
+0

取代你的地方總數=(從c中選擇最大(總數)),它看起來更好:) – Imad

+0

@ImadoddinIbnAlauddin如果是這樣,你問了錯誤的問題。你問:_興趣更多subject_ .not:_interests最大數量subject_ :-) –

+1

是的,你是對的@royi namir。 :) – Imad

0

嘗試這個

select * from person 
    where id in(
    Select b.pid 
    from subject b 
    group by b.pid 
    having count(b.pid)>1 
    ) 
+0

爲什麼> 1 ????????? – Imad

+0

你想要對大部分科目感興趣的學生。所以當你通過計算哪個pid到大多數主題的返回值 –

+0

我很抱歉沒有正確判斷。我已經更新了我的排隊,對不起。 – Imad

0
declare @t table (ID int,name varchar(10)) 
    insert into @t (ID,name)values (1,'imad'),(2,'sumeet'),(3,'suresh'),(4,'navin') 
    declare @tt table (Id int,Pid int,Subject varchar(10)) 
    insert into @tt (Id,Pid,subject)values (1,1,'DC'),(2,1,'DS'),(3,3,'DS'),(4,4,'CA') 

select p.ID,P.name,ttt.Subject from (Select P.ID,P.name,P.Cnt from (
select t.ID,t.name,COUNT((t.ID))Cnt from @t t 
INNER JOIN 
@tt tt ON t.ID = tt.Pid 
GROUP BY t.ID,t.name)P 
GROUP BY P.Cnt,P.ID,p.name 
HAVING(cnt) > 1)P 
INNER JOIN @tt ttt ON Ttt.Pid = P.ID 
0

TOP的當前解決方案是特定於MS SQL Server的。以下解決方案基於標準SQL的窗口集合函數,大多數DBMS支持:

select Pid, Total 
from 
(
    select Pid, count(Id) as Total 
     ,rank() over (order by count(Id) desc) as rn 
    from subjects group by Pid 
) as dt 
where rn = 1