[英]Oracle. If record exists by the first statement, ignore second one
我有一個問題,如何解決我的問題。
我有程序在里面我有這個SELECT
里面LEFT OUTER JOIN
女巫正在返回一些值:
SELECT * FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
JOIN database3 data3 ON data3.attr_id = data2.id
JOIN database4 data4 ON data4.objt_attr_id = data3.id
JOIN database5 data5 ON data5.stya_id = data4.id
AND data5.value = 1
JOIN database6 data6 ON data6.id = data5.sero_id
JOIN database7 data7 ON srv.id = data6.srv_id
JOIN database8 data8 ON data8.code IN ('CALC1','CALC2')
WHERE data1.ordet_id IN (data8.id)
正如你所看到的,他正在尋找CALC1
和CALC2
然后在data1.ordet_id
通過他們的ID's
進行搜索。 自然,他還我2個條目女巫是不正確的。
如何進行檢查。 當腳本將使用CALC1
找到記錄時,他會跳過對CALC2
的檢查,因此腳本僅通過CALC1
返回 1 條記錄(兩者都不像現在)。 反之亦然,如果沒有找到CALC1
記錄,他檢查CALC2
我認為您可以利用分析函數row_number
如下:
select * from
(SELECT data1.*, data2.*, .. data8.*,
row_number() over (partition by data1.ordet_id order by data8.code ) as rn
FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
JOIN database3 data3 ON data3.attr_id = data2.id
JOIN database4 data4 ON data4.objt_attr_id = data3.id
JOIN database5 data5 ON data5.stya_id = data4.id
AND data5.value = 1
JOIN database6 data6 ON data6.id = data5.sero_id
JOIN database7 data7 ON srv.id = data6.srv_id
JOIN database8 data8 ON data8.code IN ('CALC1','CALC2')
WHERE data1.ordet_id IN (data8.id))
where rn = 1
- 更新
根據您的以下評論,您還可以使用NOT EXISTS
和CASE..WHEN
組合,如下所示:
SELECT *
FROM
DATABASE1 DATA1
JOIN DATABASE2 DATA2 ON DATA2.ID = DATA1.ATTR_ID
JOIN DATABASE3 DATA3 ON DATA3.ATTR_ID = DATA2.ID
JOIN DATABASE4 DATA4 ON DATA4.OBJT_ATTR_ID = DATA3.ID
JOIN DATABASE5 DATA5 ON DATA5.STYA_ID = DATA4.ID
AND DATA5.VALUE = 1
JOIN DATABASE6 DATA6 ON DATA6.ID = DATA5.SERO_ID
JOIN DATABASE7 DATA7 ON SRV.ID = DATA6.SRV_ID
JOIN DATABASE8 DATA8 ON DATA8.CODE IN (
'CALC1',
'CALC2'
)
WHERE
CASE
WHEN DATA8.CODE = 'CALC1' THEN DATA1.ORDET_ID
WHEN DATA8.CODE = 'CALC2' THEN CASE
WHEN NOT EXISTS (
SELECT 1 FROM
DATABASE8 D8
WHERE DATA1.ORDET_ID = D8.ID
AND D8.CODE = 'CALC1'
) THEN DATA1.ORDET_ID
END
END = DATA8.ID
干杯!!
使用OUTER JOIN
加入兩次(即,如果匹配的代碼不存在,則不會丟失任何記錄,但不會復制結果),並從第一次或第二次加入中使用COALESCE
獲取優先代碼。
SELECT
data1.ordet_id ,
COALESCE(data81.code, data82.code) code
FROM data1.ordet_id
LEFT OUTER JOIN data81 ON data1.ordet_id = data81.id and data81.code = 'CALC1'
LEFT OUTER JOIN data82 ON data1.ordet_id = data82.id and data82.code = 'CALC2'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.