如何对查询进行 OUTER JOIN

Posted

技术标签:

【中文标题】如何对查询进行 OUTER JOIN【英文标题】:How to do a OUTER JOIN on a query 【发布时间】:2013-03-20 16:13:18 【问题描述】:

我不确定我的问题是否准确,所以我会解释一下情况。

我有 2 个表,即使没有匹配项,我也需要在其中进行左外连接以获取数据。我做了一个工作正常的查询,除了 where 语句中的一个歧视:

SELECT TableA.Type, SUM(TableB.HreReelles) AS HreReellesTotales, TableB.NoProjet_Short 
FROM TableA 
LEFT OUTER JOIN TableB ON TableA.IDType = TableB.IDType  
WHERE TableA.Categorie = 'Electrique' 
GROUP BY TableB.NoProjet_Short,TableA.Type

现在我意识到我还需要只获取特定项目的记录,但即使另一个表中没有匹配项,也要保留 OUTER JOIN 中的所有“TableA.Type”。如果我只添加“AND”语句,它会将它们从返回的记录中删除。如有必要,我会发布屏幕截图;)。

哦,我需要在完成后将其放入 OleDbCommand 中。

谢谢 西蒙

编辑:添加图片。我不需要红色部分,但我需要其余部分,包括空单元格(来自 LEFT OUTER JOIN)。

【问题讨论】:

你能发布一些示例数据和想要的结果吗? @bluefeet 刚刚发布了一个截图 :) 【参考方案1】:

对于左连接查询,您应该在连接的 on 子句中过滤“右”表中的行。

SELECT TableA.Type, SUM(TableB.HreReelles) AS HreReellesTotales, TableB.NoProjet_Short 
FROM TableA 
LEFT OUTER JOIN TableB ON TableA.IDType = TableB.IDType  
  AND TableB.ColumnName = 'SomeValue'
WHERE TableA.Categorie = 'Electrique' 
GROUP BY TableB.NoProjet_Short,TableA.Type

【讨论】:

Access 数据库似乎不支持 OUTER JOIN 中的“AND”:我使用的是 Access 2000 数据库。我在 Access 中尝试并在 OleDbCommand 中执行并得到相同的错误:“不支持连接表达式。” 我通常不回答 Access 问题,因为我知道语法不同,而且我不太熟悉。是我一个人,还是后面加的访问标签? @G Mastros 既然你在问我,我心里有点怀疑。我没有放 ms-access-2000 标签,但我很确定 ms-access 在那里。但是感谢您的帮助,能够将 AND 语句添加到 JOIN 并不是我所知道的。【参考方案2】:

我认为你可能需要走很长的路:

SELECT TableA.Type, SUM(b.HreReelles) AS HreReellesTotales, 
       b.NoProjet_Short 
FROM TableA 
LEFT JOIN (SELECT * FROM TableB 
  WHERE TableB.ColumnName = 'SomeValue') b
ON TableA.IDType = b.IDType  
WHERE TableA.Categorie = 'Electrique' 
GROUP BY b.NoProjet_Short,TableA.Type

【讨论】:

非常感谢它终于奏效了。我只是试图在 2 选择之间应用连接,但无法做到这一点。你又救了我@Remou :)。 感谢您收拾残局! 好吧,它似乎只适用于 Access,而不适用于 OleDb 对象。它说它找不到 TableA。 它应该可以工作。你的意思是你在 C# 或 VB.Net 中使用它?该查询没有特定于 MS Access,只有 Jet/ACE。你确定你有一个 tableA 并且你没有从数据库的副本中工作吗? Visual Studio 默认复制到项目文件夹。 我注意到我有 Tableb.NoProjet_ShortSUM(TableB.HreReelles)GROUP BY Tableb.NoProjet_Short,但 TableB 现在在子查询中,所以应该是 b.NoProjet_ShortSUM(TableB.HreReelles)GROUP BY b.NoProjet_Short 但这些错误会说不能喜欢 tableB,而不是 tableA,并且代码在 Access 中不起作用。

以上是关于如何对查询进行 OUTER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

使用 WHERE 子句中的过滤器优化 OUTER JOIN 查询。(查询规划器)

SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别

在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异

查询优化 Not in to Left outer join

多表关联查询语法?

在 MySQL 中执行 FULL OUTER JOIN 查询时出错 [重复]