Sql 从具有复合主键的表中选择
我有一个名为Sql 从具有复合主键的表中选择,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我有一个名为StudentSchool的注射表,其中包含: StudentSchoolID StudentId SchoolID 1 233 22 但现在我想用复合主键创建如下表: StudentId SchoolID 233 22 在第一种情况下,我选择使用 select * from StudentSchool where (StudentId = 233) and (SchoolID = 22)
StudentSchool
的注射表,其中包含:
StudentSchoolID StudentId SchoolID
1 233 22
但现在我想用复合主键创建如下表:
StudentId SchoolID
233 22
在第一种情况下,我选择使用
select * from StudentSchool
where (StudentId = 233) and (SchoolID = 22)
但是在第二种情况下,如何使用它,因为它是一个主键我不确定我是否正确理解了这个问题。
如果您希望学生ID为233,学号为22,则与第一个案例的查询相同。也许我遗漏了什么,但您的查询将是相同的
select * from YourNewTable where (StudentId =233)and (ScoohlID=22)
如果“添加两个Id都不验证我的业务”意味着您在尝试创建复合密钥时遇到PK冲突,那么这是因为您有多行具有相同的StudentId
+SchoolID
对
如果是这种情况,那么您需要在创建复合PK之前删除重复的行,从而对该表进行一些清理
要找出重复的配对,可以执行以下操作
select StudentId, SchoolID
from StudentSchool
group by StudentId, SchoolID
having count(*) > 1
如果理解正确,那么第一种情况下的StudentSchoolID是联接表的主键,是吗 也许您的不同之处在于第一种情况下最好的查询是:
select * from StudentSchool
where StudentSchoolID = 1
而StudentSchoolID则是StudentID和SchoolID对的代表
您的查询是第二个主ID不存在的情况
关于如何使用……我不知道。就个人而言,我更喜欢第二种,但我也认为这通常取决于(谁知道!)在特定情况下。那么,添加我的StudentSchoolID和删除它以及添加复合Id之间有什么不同呢?在asp.net中,添加一个数据键名称作为StudentSchoolID很容易,但现在添加这两个Id并不能验证我的业务。从技术上讲,使用StudentSchoolID这样的代理键和使用复合键(因为它,有很多宗教战争正在进行!)。但对于您的查询,没有区别。这两种情况都是一样的。是的,我和我的经理之间的问题是,他希望我删除它,并设置一个复合的。我告诉他,告诉我一个区别,他没有告诉我一些可以说服我的事情,这就是为什么我问这个问题,现在这里有一场战争:)你的问题保持不变-主键是否是复合键对您的查询没有影响。因此,添加my StudentSchoolID和删除它以及添加复合键之间有什么不同?在asp.net中,添加数据键名称作为StudentSchoolID很容易,但现在添加这两个Id并不能验证我的businessWell-asp.net是另一回事!您在帖子中没有提到ASP.NET。。。。。在SQL Server端,具有复合索引对查询没有影响。ASP.NET是一个不同的故事……不,没有重复,因为该学生只被分配到一所学校,我已对其进行了修改。没有重复非常感谢您的答复。现在它回答了另一个问题:)