我在 Access 查询中使用左连接来获取一个添加了仅适用于几行的列的表。当我使用子查询作为被连接的表时,它给了我一个最终表,其中新列的所有行都具有相同的值。当我构建一个提供与子查询完全相同的输出的表时,它会按照我想要的方式工作。如果子查询和表看起来相同,为什么它们会给我不同的结果。
我已经查看了有关表和派生表之间差异的其他问题(我认为我使用子查询得到了什么),两者之间似乎没有区别。
SELECT *
FROM Table1
LEFT JOIN
(SELECT *, "P" AS PColumn FROM TableX, TableY WHERE TableX.x = TableY.y) AS Table2
ON (Table1.x = Table2.x)
WHERE Table1.X > 2
PColumn 中的每个值都是“P”。当我构建一个看起来与子查询结果完全相同的表并使用它代替子查询时,只有第 5 行的 PColumn 值为“P”,其余的为空,这正是我想要的。子查询和表在外部 SELECT 语句中具有完全相同的值但不同的输出
最佳答案
根据评论推断,这似乎是 MS Access 在评估外连接时使用的 JET 数据库引擎的查询优化器中再次出现的错误,如 Allen Browne 在他的文章 here 中所述。 .
考虑以下 MCVE演示错误:
表1
+----+
| ID |
+----+
| 1 |
| 2 |
+----+
表2
+----+
| ID |
+----+
| 1 |
+----+
SQL
select * from table1 left join (select table2.id, "x" as X from table2) q on table1.id = q.id
应返回:
+-----------+------+---+
| table1.id | q.id | X |
+-----------+------+---+
| 1 | 1 | x |
| 2 | | |
+-----------+------+---+
实际返回:
+-----------+------+---+
| table1.id | q.id | X |
+-----------+------+---+
| 1 | 1 | x |
| 2 | | x |
+-----------+------+---+
关于sql - 为什么在左连接中使用子查询会给出与等效表完全不同的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55621553/