VBA SQL 来自同一 table 的数据集的交叉替换。 (微软访问)
VBA SQL Intersect replacement for datasets from the same table. (MS Access)
我相信 'Intersect' 是我的问题的解决方案,但是在 VBA 中实施它让我很吃力..
我有两个 table:
- 项目,为了我们的目的,单列 [ItemNumber]
- 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)。如果这不是您想要的,请将 >
条件更改为 <>
我相信 'Intersect' 是我的问题的解决方案,但是在 VBA 中实施它让我很吃力..
我有两个 table:
- 项目,为了我们的目的,单列 [ItemNumber]
- 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)。如果这不是您想要的,请将 >
条件更改为 <>