匹配2查询中的where子句

时间:2014-05-22 06:10:20

标签: sql sql-server sql-server-2012 query-optimization

假设我有一个数据库,其组织可以属于一个或多个病房,每个病房属于一个或多个扇区。现在我想要一个查询,显示属于同一病房中相同扇区的其他组织。我传递了一个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工作。只是一些相关的表格如下:

DB Structure


编辑:让我用这个视觉示例澄清一下。确实可以为任何组织添加多个病房和部门。在此示例组织中添加了病房和部门:

enter image description here

现在我希望我的查询返回其他组织,这些组织位于同一病房和上述示例组织所在的同一区域中的病房。目前,我的where子句返回同一部门和同一病房的组织:

enter image description here

这是不正确的。病房部门都应该与显示的其他组织匹配。例如,只有59区和59区的组织在艺术和文化领域。此时显示了针对病房59的BUSINESS,因为示例组织在病房71中有业务。

1 个答案:

答案 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分隔列表。