访问选择多个"和"的查询详细地

时间:2015-02-20 08:57:02

标签: sql vb.net ms-access ms-access-2010

我有一个包含此表的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

但这是否可以用于那些查询?

0 个答案:

没有答案