我正在嘗試找到一種解決 sql 查詢的方法。我想做一個子查詢來首先選擇為產品 ID 啟用文章。事實上,我正在處理查詢的一部分。如果沒有啟用文章,我只想要最后一次啟用或最后禁用的產品的一篇文章。問題是我最初被要求不要在沒有加入的情況下使用加入請求。這是舊版應用程式。
這是一個作業示例:
from T_PRODUIT pro, T_PRODUIT_PLATEFORME_EXTENDED pre, T_ARTICLE art, T_TAUX_TVA tva
where pro.id_produit = 1330442
and art.id_article in (select id_article from T_ARTICLE ta where ta.id_produit = pro.id_produit and ta.id_fournisseur = pre.id_fournisseur_article)
and pro.ID_PRODUIT = pre.ID_PRODUIT
and pre.ID_PRODUIT = art.ID_PRODUIT( )
and pre.ID_FOURNISSEUR_ARTICLE = art.ID_FOURNISSEUR( )
and tva.CODE = pro.ID_TVA
我想要什么:
from T_PRODUIT pro, T_PRODUIT_PLATEFORME_EXTENDED pre, T_ARTICLE art, T_TAUX_TVA tva
where pro.id_produit = 1330442
and art.id_article in (select * from (select id_article from T_ARTICLE ta where ta.id_produit = pro.id_produit and ta.id_fournisseur = pre.id_fournisseur_article order by ta.actif DESC) where rownum < 2)
and pro.ID_PRODUIT = pre.ID_PRODUIT
and pre.ID_PRODUIT = art.ID_PRODUIT( )
and pre.ID_FOURNISSEUR_ARTICLE = art.ID_FOURNISSEUR( )
and tva.CODE = pro.ID_TVA
第二個例子的問題是有兩個嵌套級別,在這種情況下 pro 和 pre 是無效的識別符號。有人知道我如何繞過這個問題嗎?資料庫有時包含導致復雜 sql 的奇怪行。謝謝。
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用以下FETCH FIRST ROW ONLY語法:
from T_PRODUIT pro
INNER JOIN T_PRODUIT_PLATEFORME_EXTENDED pre
ON (pro.ID_PRODUIT = pre.ID_PRODUIT)
LEFT OUTER JOIN T_ARTICLE art
ON ( pre.ID_PRODUIT = art.ID_PRODUIT
AND pre.ID_FOURNISSEUR_ARTICLE = art.ID_FOURNISSEUR)
INNER JOIN T_TAUX_TVA tva
ON (tva.CODE = pro.ID_TVA)
WHERE pro.id_produit = 1330442
AND art.id_article in ( select id_article
from T_ARTICLE ta
where ta.id_produit = pro.id_produit
and ta.id_fournisseur = pre.id_fournisseur_article
order by ta.actif DESC
FETCH FIRST ROW ONLY
)
注意:您可能希望將該IN過濾條件移動到連接的ON子句,使其成為外部連接條件的一部分;否則,您實際上是將 轉換OUTER JOIN為INNER JOIN.
在早期版本中,您可以使用:
from T_PRODUIT pro
INNER JOIN T_PRODUIT_PLATEFORME_EXTENDED pre
ON (pro.ID_PRODUIT = pre.ID_PRODUIT)
LEFT OUTER JOIN T_ARTICLE art
ON ( pre.ID_PRODUIT = art.ID_PRODUIT
AND pre.ID_FOURNISSEUR_ARTICLE = art.ID_FOURNISSEUR)
INNER JOIN T_TAUX_TVA tva
ON (tva.CODE = pro.ID_TVA)
WHERE pro.id_produit = 1330442
AND art.id_article in ( select ta.id_article
from (
SELECT id_produit,
id_fournisseur,
id_article
FROM T_ARTICLE
order by actif DESC
) ta
where ta.id_produit = pro.id_produit
and ta.id_fournisseur = pre.id_fournisseur_article
and ROWNUM < 2
)
注意:同樣,您可能希望將其移動到連接條件中。
但是,您可能想要的是:
from T_PRODUIT pro
INNER JOIN T_PRODUIT_PLATEFORME_EXTENDED pre
ON (pro.ID_PRODUIT = pre.ID_PRODUIT)
LEFT OUTER JOIN (
SELECT ta.*,
ROW_NUMBER() OVER (
PARTITION BY ID_PRODUIT, ID_FOURNISSEUR
ORDER BY actif DESC
) AS rn
FROM T_ARTICLE ta
) art
ON ( pre.ID_PRODUIT = art.ID_PRODUIT
AND pre.ID_FOURNISSEUR_ARTICLE = art.ID_FOURNISSEUR
AND art.rn = 1)
INNER JOIN T_TAUX_TVA tva
ON (tva.CODE = pro.ID_TVA)
WHERE pro.id_produit = 1330442
或者,使用舊連接:
from T_PRODUIT pro,
T_PRODUIT_PLATEFORME_EXTENDED pre,
(
SELECT ta.*,
ROW_NUMBER() OVER (
PARTITION BY ID_PRODUIT, ID_FOURNISSEUR
ORDER BY actif DESC
) AS rn
FROM T_ARTICLE ta
) art,
T_TAUX_TVA tva
WHERE pro.id_produit = 1330442
AND pro.ID_PRODUIT = pre.ID_PRODUIT
AND tva.CODE = pro.ID_TVA
AND pre.ID_PRODUIT = art.ID_PRODUIT ( )
AND pre.ID_FOURNISSEUR_ARTICLE = art.ID_FOURNISSEUR ( )
AND 1 = art.rn ( )
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497751.html
上一篇:多個連接顯示學生課程名稱
