假设我有一个数据库,其组织可以属于一个或多个病房,每个病房属于一个或多个扇区。现在我想要一个查询,显示属于同一病房中相同扇区的其他组织。我传递了一个varchar
的查询,其中包含id,逗号分隔。然后我有一个分割这些id的函数:
WHERE
ess.SPEAKER_SECTOR_ID IN (SELECT s.item FROM ufn_SplitIntArray(@P_Sectors, ',') s)
AND w.WARD_ID IN (SELECT s.item FROM ufn_SplitIntArray(@P_Wards, ',') s)
问题是,这会返回组织所属的所有部门以及它所在的所有病房。例如:
假设该组织有以下病房/部门:
病房|行业
59 |艺术与文化
71 |业务
72 |安全和安保组织
例如,这将显示病房59和部门业务中的组织,即使当前组织不属于病房59中的业务部门,但仅限于病房71.
编辑:好吧,数据库非常复杂且不可更改,因为一些遗留的delphi应用程序显然仍在使用它。我在ASP.NET工作。只是一些相关的表格如下:
编辑:让我用这个视觉示例澄清一下。确实可以为任何组织添加多个病房和部门。在此示例组织中添加了病房和部门:
现在我希望我的查询返回其他组织,这些组织位于同一病房和上述示例组织所在的同一区域中的病房。目前,我的where子句返回同一部门和同一病房的组织:
这是不正确的。病房和部门都应该与显示的其他组织匹配。例如,只有59区和59区的组织在艺术和文化领域。此时显示了针对病房59的BUSINESS,因为示例组织在病房71中有业务。
答案 0 :(得分:1)
目前尚不清楚,但我想这是因为你将这些条件放在不同的桌子上。
您应该将此条件放在仅有一个表格上:ELEC_INTEREST_WARD
SELECT o.* FROM ORGANISATION o
JOIN ELEC_INTEREST_GROUP ON EIG ON O.Org_id=EIG.Org_id
JOIN ELEC_INTEREST_WARD ON EIW ON EIG.INTEREST_GROUP_ID=EIW.INTEREST_GROUP_ID
WHERE
EIW.SPEAKER_SECTOR_ID IN
(SELECT s.item FROM ufn_SplitIntArray(@P_Sectors, ',') s)
AND
EIW.WARD_ID IN
(SELECT s.item FROM ufn_SplitIntArray(@P_Wards, ',') s)
另一种方法是仅使用INTEREST_WARD_ID
列表参数来获得精确对而不是WARD和SECTORS分隔列表。