我有一个包含此表的Access DB: (对不起,我是stackoverflow的新手,不能直接添加这张图片)
http://i.imgur.com/R03vky3.png?1
数据来自word文档。我有多个页面名称和内容控件(表CCInfo)
如果我开始查询(使用Access创建):
SELECT DISTINCT DokInfo.*
FROM
SeitenName INNER JOIN (
(DokInfo INNER JOIN Hilfstabelle_Seiten ON DokInfo.ID = Hilfstabelle_Seiten.DokInfoID)
INNER JOIN (CCInfo INNER JOIN Hilfstabelle_Seite_CC ON CCInfo.ID = Hilfstabelle_Seite_CC.CCInfoID)
ON Hilfstabelle_Seiten.ID = Hilfstabelle_Seite_CC.Hilfstabelle_SeitenID)
ON SeitenName.ID = Hilfstabelle_Seiten.SeitenNameID
WHERE ((CCInfo.CCName)="Land") AND ((CCInfo.Inhalt)="Deutschland")
我可以从DokInfo获取所有记录,其中包含搜索词的详细信息表(CCInfo)行。
如果我将WHERE更改为:
WHERE (
((CCInfo.CCName)="Land") AND ((CCInfo.Inhalt)="Deutschland")
OR
((CCInfo.CCName)="Land") AND ((CCInfo.Inhalt)="Frankreich")
)
效果很好。
但我怎样才能搜索“Land = Deutschland”和“Artikel = Schraube”? 如果我尝试使用:
WHERE (
((CCInfo.CCName)="Land") AND ((CCInfo.Inhalt)="Deutschland")
AND
((CCInfo.CCName)="Artikel") AND ((CCInfo.Inhalt)="Schraube")
)
我没有结果。我认为这是对的。我没有两个结果的“一个”数据行。
我发现这可以通过SQL中的intersect来完成。但我怎样才能在Access(2010)中做到这一点?我能找到的所有例子,我都无法切换到我的案例。
后来我想在vb.net projekt中实现它,以便在用户输入上动态创建查询。如果我查询不同的表并对程序中的表进行评估,它可能会更好吗?
提前致谢。
编辑:
经过几次测试后我找到了一种方法......但结果不正确:
select DokInfo.ID, DokInfo.Maschinennummer
FROM
(
SELECT DokInfo.ID, DokInfo.Maschinennummer
FROM
SeitenName INNER JOIN ((DokInfo INNER JOIN Hilfstabelle_Seiten ON DokInfo.ID = Hilfstabelle_Seiten.DokInfoID) INNER JOIN (CCInfo INNER JOIN Hilfstabelle_Seite_CC ON CCInfo.ID = Hilfstabelle_Seite_CC.CCInfoID) ON Hilfstabelle_Seiten.ID = Hilfstabelle_Seite_CC.Hilfstabelle_SeitenID) ON SeitenName.ID = Hilfstabelle_Seiten.SeitenNameID
WHERE
(
((CCInfo.CCName)="Land") AND ((CCInfo.Inhalt)="Frankreich")
OR
((CCInfo.CCName)="Artikel") AND ((CCInfo.Inhalt)="Schraube")
)
)
GROUP BY DokInfo.ID, DokInfo.Maschinennummer
HAVING COUNT(*) = 2
如果其中一个条件具有多个行(例如,其中两个元素具有“CCName = Land”和“Inhalt =”Frankreich“),则计数(*)为= 3
如果我使用UNION,它似乎正在起作用:
select DokInfo.ID, DokInfo.Maschinennummer
FROM
(
SELECT DISTINCT DokInfo.*
FROM
SeitenName INNER JOIN ((DokInfo INNER JOIN Hilfstabelle_Seiten ON DokInfo.ID = Hilfstabelle_Seiten.DokInfoID) INNER JOIN (CCInfo INNER JOIN Hilfstabelle_Seite_CC ON CCInfo.ID = Hilfstabelle_Seite_CC.CCInfoID) ON Hilfstabelle_Seiten.ID = Hilfstabelle_Seite_CC.Hilfstabelle_SeitenID) ON SeitenName.ID = Hilfstabelle_Seiten.SeitenNameID
WHERE ((CCInfo.CCName)="Land") AND ((CCInfo.Inhalt)="Deutschland")
UNION ALL
SELECT DISTINCT DokInfo.*
FROM
SeitenName INNER JOIN ((DokInfo INNER JOIN Hilfstabelle_Seiten ON DokInfo.ID = Hilfstabelle_Seiten.DokInfoID) INNER JOIN (CCInfo INNER JOIN Hilfstabelle_Seite_CC ON CCInfo.ID = Hilfstabelle_Seite_CC.CCInfoID) ON Hilfstabelle_Seiten.ID = Hilfstabelle_Seite_CC.Hilfstabelle_SeitenID) ON SeitenName.ID = Hilfstabelle_Seiten.SeitenNameID
WHERE ((CCInfo.CCName)="Artikel") AND ((CCInfo.Inhalt)="Schraube")
)
GROUP BY DokInfo.ID, DokInfo.Maschinennummer
HAVING COUNT(*) = 2
但我觉得这很慢?它的优点是我可以在vb.net中简单地创建命令字符串。甚至可以进行多次OR-OR查询。
select DokInfo.ID, DokInfo.Maschinennummer
FROM
(
SELECT DISTINCT DokInfo.*
FROM
[....]
WHERE [....]
UNION ALL
SELECT DISTINCT DokInfo.*
FROM
[....]
WHERE [....]
)
GROUP BY DokInfo.ID, DokInfo.Maschinennummer
HAVING COUNT(*) = 2
UNION
select DokInfo.ID, DokInfo.Maschinennummer
FROM
(
SELECT DISTINCT DokInfo.*
FROM
[....]
WHERE [....]
UNION ALL
SELECT DISTINCT DokInfo.*
FROM
[....]
WHERE [....]
UNION ALL
SELECT DISTINCT DokInfo.*
FROM
[....]
WHERE [....]
)
GROUP BY DokInfo.ID, DokInfo.Maschinennummer
HAVING COUNT(*) = 3
但这是否可以用于那些查询?