使用逗号分隔列使用sql左连接

时间:2014-09-02 08:09:58

标签: sql sql-server sql-server-2008 tsql

我正在使用带有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行。我想只显示一行。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

我在这里停止阅读:

  

职位空缺表有一个名为dutystationId的列,它以逗号分隔列表存储职责站的ID

那是你的问题。如果您在RDBMS中使用逗号分隔值,特别是如果它们包含其他表的外键,则应暂停完全停止您正在执行的操作并开始重新设计数据库。 RDBMS中的多对多关系是用junction tables实现的,如果你使用它们,你所有的问题都会突然解决。

你当前的设计不仅仅是编写SQL查询的地狱,就像这个问题一样完美,因为你无法解决一个微不足道的任务,但它也会杀死性能 - 那些对hr_Split的调用的计算成本远远超过做正确的连接。

Don't fall into the XY trap,首先解决实际问题。您现在甚至违反了First Normal Form