Oracle。如果第一个语句存在记录,则忽略第二个]

问题描述 投票:0回答:2

我在问如何解决我的问题。

[我有一个程序,其中我在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)

您可以看到他正在寻找CALC1CALC2,然后在ID's中按它们的data1.ordet_id进行搜索。自然,他还给我退回了2条女巫,这是不正确的。

如何进行支票。当脚本将找到带有CALC1的记录时,他将跳过对CALC2的检查,因此脚本在CALC1之前仅返回1条记录(这两个现在都不一样)。反之亦然,如果找不到CALC1记录,他会检查CALC2

sql oracle function procedure
2个回答
0
投票

我认为您可以利用分析函数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

干杯!


0
投票

使用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'
© www.soinside.com 2019 - 2024. All rights reserved.