2011-08-22 61 views
3

我打針表稱爲StudentSchool包含:從表中選擇複合主鍵

StudentSchoolID StudentId SchoolID 
1    233   22 

但現在我想使表與複合主鍵是這樣的:

StudentId SchoolID 
    233   22 

在我選擇的第一種情況是

select * from StudentSchool 
where (StudentId = 233) and (SchoolID = 22)  

但在第二種情況下如何做到這一點它是主鍵

+2

您的查詢保持不變 - 主鍵是否爲組合鍵對查詢沒有影響。 –

+0

所以添加我的StudentSchoolID並刪除它並添加複合一個有什麼不同,在asp.net中很容易添加一個數據鍵名作爲StudentSchoolID,但現在添加這兩個Id是不驗證我的業務 –

+0

嗯 - ASP.NET是一個不同的故事!你沒有在你的文章中提到任何**提到ASP.NET ......在SQL Server端,有一個複合索引對你的查詢沒有影響。 ASP.NET是一個不同的故事.... –

回答

7

我不確定是否正確理解了問題。
如果你想讓StudentId 233和SchoolId 22的學生看起來像第一個案例一樣。

+0

所以添加我的StudentSchoolID和刪除它並添加複合一個有什麼不同之處,它很容易在asp.net中添加一個數據鍵名作爲StudentSchoolID,但現在添加兩個Id的不是驗證我的業務 –

+0

從技術上來說,使用像您的StudentSchoolId這樣的代理鍵和使用組合鍵是有區別的(並且因爲這個原因,有很多宗教戰爭正在進行!)。但對於您的查詢,沒有區別。兩種情況都是一樣的。 –

+0

是的,我和我的經理之間的問題是他希望我刪除它,並設置一個複合一個我告訴他告訴我一個區別,他沒有告訴我的一些事情可以說服我,這就是爲什麼我問這個問題有一個這裏的戰爭:) –

2

也許我失去了一些東西,但你的查詢將是相同的

select * from YourNewTable where (StudentId =233)and (ScoohlID=22) 
1

如果「加上這兩個ID不驗證我的業務」意味着你得到一個PK違反當您嘗試創建複合鍵,那麼它的原因是你有多於一行的StudentId + SchoolID對。

如果是這種情況,那麼您需要在該表上進行一些清理,方法是在創建組合PK之前刪除重複的行。

要找出重複的對,你可以這樣做

select StudentId, SchoolID 
    from StudentSchool 
group by StudentId, SchoolID 
having count(*) > 1 
+0

不,沒有重複,因爲學生只被分配到一所學校,我修改了它,沒有重複,非常感謝您的回覆,現在回答了另一個問題:) –

1

如果理解對不對,那StudentSchoolID在第一種情況是連接表的主鍵,是嗎?

也許你的區別是在最佳的查詢將是第一種情況:

select * from StudentSchool 
where StudentSchoolID = 1 

和StudentSchoolID意爲「StudentID」的代表,「SchoolID」對。

您的查詢是第二個主ID不存在的情況。

關於使用什麼方式......以及我不知道。我個人更喜歡第二種,但我也認爲它通常取決於(誰知道!)關於具體情況。