VBA SQL 来自同一 table 的数据集的交叉替换。 (微软访问)

VBA SQL Intersect replacement for datasets from the same table. (MS Access)

我相信 'Intersect' 是我的问题的解决方案,但是在 VBA 中实施它让我很吃力..

我有两个 table:

  1. 项目,为了我们的目的,单列 [ItemNumber]
  2. ItemProperties,2 列 [ItemNumber],[ItemProperty]

每个项目至少(不少于)2 个属性 [ItemProperty] 和多达 700 个属性。

对于项目 table 中的每个项目,我想将它与项目 Table 中的每个其他项目进行比较,看看它们是否有任何共同的属性。

我的想法是使用:

通过两个循环阅读项目。第一个循环 select 当前项目 [FristItem],第二个循环 select 我正在与之比较的项目 [SecondItem]

Select ItemProperty from ItemProperties where ItemNumber = FirstItem
Intersect
Select ItemProperty from ItemProperties where ItemNumber = SecondItem

那,我相信会给我 FirstItem 和 SecondItem 之间的共同属性。

但是 MS Access VBA 没有实现相交。 我看到的讨论是关于如何使用 INNER JOIN 来完成同样的事情,但总是使用 2 个不同的 Table 作为来源。当我从单个 table 编写它时,我似乎在 ON 部分获得不明确的标识(两边的标识相同..)

我是 SQL 的相对初学者,我确信答案简单明了,但我今天只是想念它。 最后我需要根据每对拥有的共同属性的数量做一些事情,但我想我已经解决了这部分问题。只需要 Intersect / INNER JOIN 的帮助..

谢谢任何能给我指出正确方向的人

戴夫

您可以改为 GROUP BY。使用 HAVING 确保 FirstItem 和 SecondItem 都存在。

Select ItemProperty
from ItemProperties
where ItemNumber in (FirstItem, SecondItem)
having max(ItemNumber) <> min(ItemNumber)

自己加入替代:

select distinct i1.ItemProperty
from ItemProperties i1
join ItemProperties i2
  on i1.ItemProperty = i2.ItemProperty
where i1.ItemNumber = FirstItem
  and i2.ItemNumber = SecondItem

您还可以使用:这个SQL(或类似的):

select IPA.ItemName, IPA.ItemProperty, IPB.ItemName as CommonWithThisItem
from   ItemProperties as IPA
           inner join
           ItemProperties as IPB
           on IPA.ItemName>IPB.ItemName
                 and IPA.ItemProperty=IPB.ItemProperty

使用的大于标准强制仅返回两个组合中的一个(即,具有 comoon 属性 的项目名称是 ItemA 和 ItemB;通常 ItemA、ItemB 和 ItemB、ItemA对您的查询有效 returns)。如果这不是您想要的,请将 > 条件更改为 <>