显示其中一个左连接的列值

时间:2014-09-22 16:04:37

标签: sql oracle oracle10g

如果SAL.ID_AMENAZAMFT架构中存在MFA,则此查询会显示一行,但我想显示MFT.ID_AMENAZAMFA.ID_AMENAZA(如果存在)结果行中的任何表格。

在我的实际查询中,我不需要ID_AMENAZA。我该如何展示?

SELECT SAL.ID_SALVAGUARDA, SAL.DESCRIPCION, SAL.EFICACIA
FROM AGR_SALVAGUARDAS SAL 
     LEFT JOIN AGR_MIT_FREC_TIPO MFT
     ON SAL.ID_SALVAGUARDA = MFT.ID_SALVAGUARDA AND MFT.ID_AMENAZA = 5043 
     LEFT JOIN AGR_MIT_FREC_ACT MFA
     ON SAL.ID_SALVAGUARDA = MFA.ID_SALVAGUARDA AND MFA.ID_AMENAZA = 5043   
WHERE MFT.ID_SALVAGUARDA IS NOT NULL OR
      MFA.ID_SALVAGUARDA IS NOT NULL
GROUP BY SAL.ID_SALVAGUARDA, SAL.DESCRIPCION, SAL.EFICACIA

我需要获得一个这样的表:

ID_SALVAGUARDA | DESCRIPCION | EFICACIA | ID_AMENAZA
5061           | PRE-01      | 100      | 5043

提前谢谢。

2 个答案:

答案 0 :(得分:3)

这应该适合你:

SELECT SAL.ID_SALVAGUARDA, SAL.DESCRIPCION, SAL.EFICACIA, 5043 as ID_AMENAZA
FROM AGR_SALVAGUARDAS SAL 
     LEFT JOIN AGR_MIT_FREC_TIPO MFT
     ON SAL.ID_SALVAGUARDA = MFT.ID_SALVAGUARDA AND MFT.ID_AMENAZA = 5043 
     LEFT JOIN AGR_MIT_FREC_ACT MFA
     ON SAL.ID_SALVAGUARDA = MFA.ID_SALVAGUARDA AND MFA.ID_AMENAZA = 5043   
WHERE MFT.ID_SALVAGUARDA IS NOT NULL OR
      MFA.ID_SALVAGUARDA IS NOT NULL
GROUP BY SAL.ID_SALVAGUARDA, SAL.DESCRIPCION, SAL.EFICACIA;

因为您的查询保证至少有一个匹配。

然而,更通用的解决方案是:

SELECT SAL.ID_SALVAGUARDA, SAL.DESCRIPCION, SAL.EFICACIA,
       cOALESCE(MFT.ID_AMENAZA, MFA.ID_AMENAZA) as ID_AMENAZA
. . .

函数COALESCE()在其参数列表中返回第一个不是NULL的值。

答案 1 :(得分:1)

您可coalesce为此。

SELECT 
  SAL.ID_SALVAGUARDA, 
  SAL.DESCRIPCION, 
  SAL.EFICACIA, 
  COALESCE( MFT.ID_AMENAZA, MFA.ID_AMENAZA) as ID_AMENAZA

这将返回非空的第一个ID。