sql - Oracle 9i SQL查询-多次连接同一个表

标签 sql oracle left-join

我对一个简单的 SQL 查询有一个奇怪的行为。我在 Oracle 9i 上工作。 我只是想确保我的查询中没有愚蠢的错误。如果有人能告诉我我做错了什么。这是查询:

select p.PARTNUM,
        p.N_DATAA, dataa1.ID_DATA as ID_DATAA,
        p.N_DATAF, dataf1.ID_DATA as ID_DATAF,
        p.N_DATAS, datas1.ID_DATA as ID_DATAS
from PIECES p
left join DATA dataa1 on
              dataa1.N_DATA = p.N_DATAA AND
              dataa1.REV_DATA = ( select max(dataa2.REV_DATA) from DATA dataa2 
                                  where dataa2.N_DATA = p.N_DATAA )
left join DATA dataf1 on
              dataf1.N_DATA = p.N_DATAF AND
              dataf1.REV_DATA = ( select max(dataf2.REV_DATA) from DATA dataf2 
                                  where dataf2.N_DATA = p.N_DATAF )
left join DATA datas1 on
              datas1.N_DATA = p.N_DATAS AND
              datas1.REV_DATA = ( select max(datas2.REV_DATA) from DATA datas2 
                                  where datas2.N_DATA = p.N_DATAS )
where p.PARTNUM='MYPARTNUM';

这是结果:

"PARTNUM"      "N_DATAA"  "ID_DATAA"  "N_DATAF"   "ID_DATAF"  "N_DATAS"   "ID_DATAS"                     
"MYPARTNUM"    "A23240"   "300"       "F4130"     "398"       "S2330"     ""                

我的问题出现在 ID_DATAS 字段上(我确信应该返回 ID_DATAS,请参见下文),它的行为就好像它忽略了最后一个连接并且不检索任何数据。如果我删除第二个连接,它就可以正常工作。看来 Oracle 不支持超过 2 个左连接...(???)

这是我切换最后两个左连接时的另一个示例(在这种情况下,问题出现在 ID_DATAF 上):

select p.PARTNUM,
        p.N_DATAA, dataa1.ID_DATA as ID_DATAA,
        p.N_DATAF, dataf1.ID_DATA as ID_DATAF,
        p.N_DATAS, datas1.ID_DATA as ID_DATAS
from PIECES p
left join DATA dataa1 on
              dataa1.N_DATA = p.N_DATAA AND
              dataa1.REV_DATA = ( select max(dataa2.REV_DATA) from DATA dataa2 
                                  where dataa2.N_DATA = p.N_DATAA )
left join DATA datas1 on
              datas1.N_DATA = p.N_DATAS AND
              datas1.REV_DATA = ( select max(datas2.REV_DATA) from DATA datas2 
                                  where datas2.N_DATA = p.N_DATAS )
left join DATA dataf1 on
              dataf1.N_DATA = p.N_DATAF AND
              dataf1.REV_DATA = ( select max(dataf2.REV_DATA) from DATA dataf2 
                                  where dataf2.N_DATA = p.N_DATAF )
where p.PARTNUM='MYPARTNUM';

这是结果:

"PARTNUM"      "N_DATAA"  "ID_DATAA"  "N_DATAF"   "ID_DATAF"  "N_DATAS"   "ID_DATAS"                     
"MYPARTNUM"    "A23240"   "300"       "F4130"     ""          "S2330"     "400"        

感谢您的帮助:)

编辑:在查询中添加完全限定的列名称(不能解决我的问题)

最佳答案

您的旧版本 Oracle 可能遇到错误。 Oracle 9i 是第一个支持 ANSI 连接的版本,并且存在一些 ANSI 连接语法错误。

您的查询不会在最新的 (11.2) Oracle 数据库 ( SQLFiddle ) 中运行,您将遇到:

ORA-01799: a column may not be outer-joined to a subquery

因此,您的 Oracle 版本中的错误是此查询不应返回任何结果。无论如何,请确保您正在运行最新的补丁集。此外,计划升级可能是个好主意,此版本已弃用 - 扩展支持在3年前结束!

您必须重写查询,例如如下所示:

SQL> WITH filtered_data AS (
  2     SELECT n_data, rev_data, id_data
  3       FROM DATA d
  4      WHERE rev_data = (SELECT MAX(rev_data)
  5                          FROM DATA d_in
  6                         WHERE d_in.n_data = d.n_data)
  7  )
  8  SELECT p.partnum,
  9         p.n_dataa,
 10         A.id_data AS id_dataa,
 11         p.n_dataf,
 12         F.id_data AS id_dataf,
 13         p.n_datas,
 14         S.id_data AS id_datas
 15    FROM pieces p
 16    LEFT JOIN filtered_data A ON A.n_data = p.n_dataa
 17    LEFT JOIN filtered_data S ON S.n_data = p.n_datas
 18    LEFT JOIN filtered_data F ON F.n_data = p.n_dataf
 19   WHERE p.PARTNUM = 'MYPARTNUM';

PARTNUM       N_DATAA  ID_DATAA  N_DATAF  ID_DATAF  N_DATAS  ID_DATAS
------------- -------- --------- -------- --------- -------- ---------
MYPARTNUM     A23240   300       F4130    398       S2330    400

关于sql - Oracle 9i SQL查询-多次连接同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16934175/

相关文章:

ruby-on-rails - 使用左连接时主键为空

mysql - 从多个 LEFT JOIN 获取不同的行

sql - 与 SQL Server 2014 中的字符串进行比较时标识符无效

sql - 将文件插入 Postgres 数据库

oracle - 更改数据格式

sql - Oracle 根据年份选择日期返回不一致的结果

linq - 在 NHibernate 3.2 中左加入 linq

mysql - 在mysql中存储日期

sql - 使用 Vbscript 处理大型 csv(500k 记录)并将其导入 SQL Server 的最佳方法是什么?

mysql - DESCRIBE 语法可以嵌入到 SELECT 语句中吗?