问题描述
如何在 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 视图。此外,可视化查询设计器往往会使最后一个查询变形并使其无法使用。