Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从具有复合主键的表中选择_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

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是一个不同的故事……不,没有重复,因为该学生只被分配到一所学校,我已对其进行了修改。没有重复非常感谢您的答复。现在它回答了另一个问题:)