具有多个条件的 MS Access 查询

问题描述

如何在 MS Access 中构建以下查询

在我的结果表中写下以下值:

什么时候 第 1 列:

  • 三行包含相同的数字值“####”,但“####”必须与所有 3 个扩展名“.par”、“”一起找到。 dft","*.psm"

AND 第 2 列

  • 示例中的第一行必须与第二行具有相同的值

AND 第 3 列

  • 示例中的第一行必须与第二行具有相同的值
第 1 列 第 2 列 第 3 列
1234.par 1234 01
1234.dft 1234 01
1234.psm 1234 01

仅供参考: 写入查询以下结果:

  • 表中只有 1234.par 和 1234.dft 或何时在表中更多 1234.par 和 1234.dft,但它们在第 3 列中拥有不同的值
第 1 列 第 2 列 第 3 列
1234.par 1234 01
1234.dft 1234 01
1234.par 1234 02
1234.dft 1234 02

感谢您的任何提示

解决方法

您必须使用自联接来比较同一表的行。这将产生属于同一行的 3 行。

SELECT t1.Column1,t2.Column1,t3.Column1,t1.Column2,t1.Column3
FROM
    (T AS t1
     INNER JOIN T AS t2 ON (t1.Column3 = t2.Column3) AND (t1.Column2 = t2.Column2))
     INNER JOIN T AS t3 ON (t2.Column3 = t3.Column3) AND (t2.Column2 = t3.Column2)
WHERE
    t1.Column1=[t1].[Column2] & '.par' AND
    t2.Column1=[t2].[Column2] & '.dft' AND
    t3.Column1=[t3].[Column2] & '.psm';

如果您需要将它们作为三行,您有不同的可能性。一种方法是通过每次从不同的表中选择列,在 UNION ALL 查询中使用此查询 3 次:

SELECT t1.Column1,t1.Column3
FROM
    (T AS t1
     INNER JOIN T AS t2 ON (t1.Column3 = t2.Column3) AND (t1.Column2 = t2.Column2))
     INNER JOIN T AS t3 ON (t2.Column3 = t3.Column3) AND (t2.Column2 = t3.Column2)
WHERE
    t1.Column1=[t1].[Column2] & '.par' AND
    t2.Column1=[t2].[Column2] & '.dft' AND
    t3.Column1=[t3].[Column2] & '.psm'
UNION ALL
SELECT t2.Column1,t2.Column2,t2.Column3
FROM
    (T AS t1
     INNER JOIN T AS t2 ON (t1.Column3 = t2.Column3) AND (t1.Column2 = t2.Column2))
     INNER JOIN T AS t3 ON (t2.Column3 = t3.Column3) AND (t2.Column2 = t3.Column2)
WHERE
    t1.Column1=[t1].[Column2] & '.par' AND
    t2.Column1=[t2].[Column2] & '.dft' AND
    t3.Column1=[t3].[Column2] & '.psm'
UNION ALL
SELECT t3.Column1,t3.Column2,t3.Column3
FROM
    (T AS t1
     INNER JOIN T AS t2 ON (t1.Column3 = t2.Column3) AND (t1.Column2 = t2.Column2))
     INNER JOIN T AS t3 ON (t2.Column3 = t3.Column3) AND (t2.Column2 = t3.Column2)
WHERE
    t1.Column1=[t1].[Column2] & '.par' AND
    t2.Column1=[t2].[Column2] & '.dft' AND
    t3.Column1=[t3].[Column2] & '.psm'

另一种可能性是将第一个查询用作子选择并再次将其连接到表本身:

SELECT T.*
FROM
   (SELECT t1.Column1 as C1,t2.Column1 as C2,t3.Column1 as C3,t1.Column3
    FROM
        (T AS t1
         INNER JOIN T AS t2 ON (t1.Column3 = t2.Column3) AND (t1.Column2 = t2.Column2))
         INNER JOIN T AS t3 ON (t2.Column3 = t3.Column3) AND (t2.Column2 = t3.Column2)
    WHERE
        t1.Column1=[t1].[Column2] & '.par' AND
        t2.Column1=[t2].[Column2] & '.dft' AND
        t3.Column1=[t3].[Column2] & '.psm') AS X
    INNER JOIN T ON (X.C1 = T.Column1 OR X.C2 = T.Column1 OR X.C3 = T.Column1);

请注意,最后两个示例无法在可视化查询设计器中显示。您必须使用设计器的 SQL 视图。此外,可视化查询设计器往往会使最后一个查询变形并使其无法使用。