【问题标题】:Match 2 where clauses in query在查询中匹配 2 个 where 子句
【发布时间】:2014-07-11 00:43:30
【问题描述】:

假设我有一个组织的数据库,该组织可以属于 1 个或多个病房,每个病房可以属于 1 个或多个部门。现在我想要一个查询,显示属于同一病房中同一部门的其他组织。我将查询传递给包含 id 的 varchar,以逗号分隔。然后我有一个拆分这些 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 和部门 BUSINESS 中的组织,即使当前组织不属于病房 59 中的 BUSINESS 部门,而仅属于病房 71。


编辑: 好吧,数据库非常复杂且不可更改,因为某些旧版 delphi 应用程序显然仍在使用它。我在 ASP.NET 中工作。仅部分相关表格如下:


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

现在我希望我的查询返回 other 组织,这些组织既位于同一病房中,又与上述示例组织所在的同一部门中的该病房相同。此时,我的 where 子句返回位于同一部门且分别位于同一病房的组织:

这是不正确的。病房 和 部门都应与显示的其他组织相匹配。例如,只有在 59 区和 59 区的艺术和文化部门的组织。由于示例组织在 71 号病房中有业务,因此现在显示 BUSINESS 59。

【问题讨论】:

  • 你能告诉我们你的数据库结构吗?
  • @Arion:提供的数据库结构摘录
  • 我一遍又一遍地阅读你的问题......我不明白。您想获得从组织到部门和病房的独特联系吗?我的意思是你的数据库结构基本上告诉我同一个组织可以有多个连接到同一个病房和部门
  • @Arion:我为看起来模棱两可而道歉。希望现在更清楚一点

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


【解决方案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 分隔的列表。

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多