sql - 为什么在左连接中使用子查询会给出与等效表完全不同的答案?

标签 sql ms-access

我在 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/

相关文章:

ms-access - ACCESS 中的替换功能

ms-access - 如何在 MS Access 数据库模块中使用 sftp?

sql - 排序结果与 mysql 中的内连接和左连接不同

mysql - 将三个表与两个动态值组合在一起

php mysql 按日期排序(最近)

ms-access - 在 Access 中禁用 msgbox

mysql - 删除mysql中的空格

sql - 高效的多重分组

ms-access - 为什么 VBA Access 中 134.605*100 不等于 13460.5?

ms-access - Access 2007 中的加密有多安全?