Sql 神谕如果第一条语句存在记录,则忽略第二条
我有一个问题,如何解决我的问题 我有一个程序,里面我有一个选择内部左外部连接,它返回我一些值:Sql 神谕如果第一条语句存在记录,则忽略第二条,sql,oracle,function,procedure,Sql,Oracle,Function,Procedure,我有一个问题,如何解决我的问题 我有一个程序,里面我有一个选择内部左外部连接,它返回我一些值: SELECT * FROM database1 data1 JOIN database2 data2 ON data2.id = data1.attr_id JOIN database3 data3 ON data3.attr_id = data2.id JO
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进行搜索。
当然,他返回我2个条目是不正确的
如何结账。当脚本将使用CALC1找到记录时,他将跳过对CALC2的检查,因此脚本只返回一条由CALC1生成的记录,而不是像现在这样同时返回这两条记录。反之亦然,如果未找到by CALC1记录,他将检查CALC2,我认为您可以利用分析函数行数,如下所示:
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
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
-更新
根据您的以下评论,您还可以在以下情况下使用NOT EXISTS和CASE..的组合:
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
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
干杯 我认为您可以利用以下分析函数行数:
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
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
-更新
根据您的以下评论,您还可以在以下情况下使用NOT EXISTS和CASE..的组合:
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
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
干杯 使用外部联接连接两次,即,如果匹配的代码不存在,则不会丢失任何记录,但您不会复制结果,并从第一次或第二次联接获得优先代码
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'
使用外部联接连接两次,即如果匹配的代码不存在,则不会丢失任何记录,但不会复制结果,并从第一次或第二次联接获得优先代码
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'
非常感谢。但问题是,他仍然会返回2个条目,但对于rown_编号,他只会隐藏第二个条目,巫婆不正常,因为他应该检查是否存在CALC1记录,如果不存在,他会查看CALC2。谢谢!但问题是,他仍然会返回2个条目,但对于rown_编号,他只会隐藏第二个条目,巫婆不正常,因为他应该检查是否存在CALC1记录,如果不存在,他会查看CALC2。