簡體   English   中英

Oracle 9i SQL查詢-同一表多次連接

[英]Oracle 9i SQL query - join multiple time the same table

使用簡單的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,請參見下文),它的作用就像忽略了最后一個聯接並且不檢索任何數據。 如果刪除SECOND聯接,它將非常有效。 好像Oracle不支持兩個以上的左聯接...(???)

這是另一個示例,當我切換最后兩個左連接(在這種情況下,問題出現在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 db( 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM