我在问如何解决我的问题。
[我有一个程序,其中我在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
,然后在ID's
中按它们的data1.ordet_id
进行搜索。自然,他还给我退回了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
干杯!
使用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'