我正在使用带有SQL Server数据库的asp.net应用程序。这个db有两个表Vaconcies和dutystations
。空缺表有一个名为dutystationId
的列,它以逗号分隔的列表存储dutystations
的ID,如下所示:
2,12,15,18,19,23
现在我想在网格中显示这个空缺,我已经使用了这样的左连接:
QUERY
SELECT * FROM dbo.hr_Vacancies
CROSS APPLY dbo.hr_Split(dbo.hr_Vacancies.DutyStationID, ',') AS s
LEFT OUTER JOIN dbo.hr_DutyStations
ON s.Data = dbo.hr_DutyStations.DutyStationID
并在xsd
中,我将vacancyid
设置为主键。但我得到错误:
错误
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
如果删除此约束,我会得到6行。我想只显示一行。我怎么能这样做?
答案 0 :(得分:4)
我在这里停止阅读:
职位空缺表有一个名为dutystationId的列,它以逗号分隔列表存储职责站的ID
那是你的问题。如果您在RDBMS中使用逗号分隔值,特别是如果它们包含其他表的外键,则应暂停完全停止您正在执行的操作并开始重新设计数据库。 RDBMS中的多对多关系是用junction tables实现的,如果你使用它们,你所有的问题都会突然解决。
你当前的设计不仅仅是编写SQL查询的地狱,就像这个问题一样完美,因为你无法解决一个微不足道的任务,但它也会杀死性能 - 那些对hr_Split
的调用的计算成本远远超过做正确的连接。
Don't fall into the XY trap,首先解决实际问题。您现在甚至违反了First Normal Form。