匹配查询中的2个where子句

卡雷尔

假设我有一个组织的数据库,该组织可以属于一个或多个病房,每个病房属于1个或多个部门。现在,我需要一个查询,以显示属于同一病房中相同部门的其他组织。我通过了一个查询,其中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的业务,因为示例组织在病房71中有业务。

瓦莱克斯

尚不清楚,但我想这是因为您将这些条件放在了不同的表上。您应该将此条件放在唯一的一张桌子上: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分隔的列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章