【问题标题】:Left Join not working with WHERE condition set to <>Left Join 不适用于 WHERE 条件设置为 <>
【发布时间】:2020-07-13 21:12:50
【问题描述】:

在我问这个问题之前,我必须承认我是 SQL 新手,但这里是这样的:

我有 3 个表:Crown FacilitytblSubProjectslnkSubProjectFacility

我使用 lnkSubProjectFacility 将设施分配给子项目,反之亦然。当用户从表单中的组合框 (cboAddFacSubProject) 中选择子项目时,组合框中的AfterUpdate 事件会导致 2 个列表框填充 lnkSubProjectFacility 表记录中的关联记录.

左侧列表框 (lstAddSubProjectFacilities) 显示与子项目关联的所有设施,右侧 (lstAddSubProFac) 显示用户可以分配的所有可用剩余设施,其中一个命令按钮,然后从右侧列表框中删除一个可用设施并将其移动到左侧(从而在 lnkSubProjectFacility 表中创建一个新记录)。

一切正常,除了我似乎无法使用下面的 VBA 代码在组合框的 AfterUpdate 事件中使用正确的可用工具填充正确的列表框:

Private Sub cboAddFacSubProject_AfterUpdate()
Dim strSQL As String, strSQL2 As String

'String SQL statment variable for the LEFT listbox - to display all ASSIGNED facilities
strSQL = "SELECT [CROWN Facility].FACILITY_ID, " & _
        "[CROWN Facility].FACILITY_NAME, " & _
        "lnkSubProjectFacility.SUBPROJECT_ID " & _
        "FROM [CROWN Facility] INNER JOIN lnkSubProjectFacility " & _
        "ON [CROWN Facility].FACILITY_ID = lnkSubProjectFacility.FACILITY_ID " & _
        "WHERE lnkSubProjectFacility.SUBPROJECT_ID =" & Me.cboAddFacSubProject & " " & _
        "ORDER BY [CROWN Facility].FACILITY_NAME"

'String SQL statment variable for the RIGHT listbox - to display all AVAILABLE facilities
strSQL2 = "SELECT [CROWN Facility].FACILITY_ID, " & _
        "[CROWN Facility].FACILITY_NAME, " & _
        "lnkSubProjectFacility.SUBPROJECT_ID " & _
        "FROM [CROWN Facility] LEFT JOIN lnkSubProjectFacility " & _
        "ON [CROWN Facility].FACILITY_ID = lnkSubProjectFacility.FACILITY_ID " & _
        "WHERE lnkSubProjectFacility.SUBPROJECT_ID <>" & Me.cboAddFacSubProject & " " & _
        "ORDER BY [CROWN Facility].FACILITY_NAME"

'RowSource for the LEFT listbox - to display all assigned facilities
lstAddSubProjectFacilities.RowSource = strSQL

'RowSource for the RIGHT listbox - to display all available facilities
lstAddSubProFac.RowSource = strSQL2

'This is just updating a label showing the count of items in the left listbox
lblListCt.Caption = lstAddSubProjectFacilities.ListCount & " Facilities Selected"

End Sub

执行此代码后,左侧列表框中的一切正常,该子项目的所有分配记录都正确显示。然而,尽管右侧列表框排除了左侧显示的所有设施,但它也排除了分配给该表中任何其他子项目的任何设施。

除了搜索这个问题的时间之外,我还尝试了 strSQL2 变量,尝试在末尾添加 IS NULL(这当然不起作用)以及许多其他事情,例如更改 JOIN 类型.最近,我将 WHERE 更改为 AND,但没有返回任何内容。

我确信有一个相当简单的解决方案,但我将非常感谢任何帮助我到达那里!

注意:我使用的是 Access 2010,但我认为这没有任何区别。

编辑:这是 lnkSubProjectFacility 表的结构:

SUBPROJECT_ID    FACILITY_ID
7                20000003   
7                20000025   
7                20000027   
8                20010302   
8                20021781   
9                20040035   
9                20044392   
10               20045465
17               10000282   
17               10000452   
17               10000844   
21               20000005   
21               20000019   
21               20000026   

CROWN Facility 表结构:

FACILITY_ID FACILITY_NAME
20000003    Barnes
20000025    Bio-Medical Applications
20000027    Barnes Center
20010302    Atlantic
20021781    Anthonys Hospital
20040035    Black Hawk
20044392    Ames
20045465    Arnold
10000282    BETHANY
10000452    ANDOVER
10000844    Ankeny
20000005    Columbia
20000019    Baptist
20000026    Childrens Hospital

tblSubProjects 表结构:

SUBPROJECT_ID    SUBPROJECT          
7            Service Project1
7            Service Project1
7            Service Project1
8            Service Project2
8            Service Project2
9            Service Project3
9            Service Project3
10           Service Project4
17           CatheterReduction1
17           CatheterReduction1
17           CatheterReduction1
21           Patient Access3
21           Patient Access3
21           Patient Access3

【问题讨论】:

  • cboAddFacSubProject是什么数据类型?
  • cboAddFacSubProject是一个对象,是用来执行上面代码的组合框的属性名。
  • 当您删除 where 子句时,它会返回数据,对吗?
  • 是的,它会返回 Crown Facility 中列出的所有设施,这些设施与已分配的设施重复了多少次。
  • 你能用两个表的实例更新你的帖子吗?如果您无法共享任何真实数据,请使用虚假数据

标签: sql ms-access vba ms-access-2010


【解决方案1】:

我将假设 lnkSubProjectFacility 旨在将 Facility 与 tblSubProjects 相关联。 lnkSubProjectFacility 似乎是我唯一会更改架构的表

lnkSubProjectFacility
         SPF_Id,  SubProject_Id, Facility_Id
           1          7           20000003
           2          7           20000025
           3          7           20000027
           4          8           20010302
           .          .               .
           .          .               .
           .          .               .

尽量规范化数据,这样更容易编写查询。

如果您尝试编写一个查询来获取所有尚未分配子项目的设施:

  select [CROWN FACILITY].FACILITY_ID, [CROWN FACILITY].FACILITY_NAME
  from [CROWN FACILITY] as CF
  where not exists (select * 
                    from lnkSubProjectFacility as lSPF
                    where CF.FACILITY_ID == lSPF.FACILITY_ID)

我相信查询应该可以工作,当我无法测试它时很难说。 有时加入不是答案。连接可能看起来更好,但有时子查询更好

【讨论】:

  • 谢谢,我会用查询代替。我正在尝试获取尚未分配特定子项目(由用户使用组合框选择)的所有设施,这就是为什么我认为这是唯一的方法。
  • 架构只是一个建议。该查询或使用not exists 的查询应该可以解决您的问题。
猜你喜欢
  • 2017-03-20
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多