需要 SQL Join 类型

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

我需要一些帮助来确定我需要什么连接类型/逻辑。我有以下数据:

enter image description here

DISTRIBUTION_ACCOUNT_ID
列来自我左连接到下面的表(
GL_CODE_COMBINATIONS
),我想匹配以绿色选择的行,其中包括已填充值的行以及
NULL
行。我还想排除
GL.SEGMENT3 <> 945
的行(这与包含
DISTRIBUTION_ACCOUNT_ID
61012 和 15000 的行相同)。问题是左外连接没有用 61012 过滤掉顶行,如果我将连接切换到
INNER JOIN
那么排除
GL.SEGMENT3 <> 945
的逻辑工作正常,但它也会过滤掉下面的空白行,我还想要。

(SELECT ABS(ROUND((SUM(PRIMARY_QUANTITY)/30),2)) AS BURN_RATE, TXN.ORGANIZATION_ID, TXN.INVENTORY_ITEM_ID,
 TXN.SUBINVENTORY_CODE , TXN.DISTRIBUTION_ACCOUNT_ID, GL.SEGMENT3
 FROM INV_MATERIAL_TXNS TXN
LEFT OUTER JOIN INV_TRANSACTION_TYPES_TL TYPE ON TYPE.TRANSACTION_TYPE_ID = TXN.TRANSACTION_TYPE_ID                                        
LEFT OUTER JOIN GL_CODE_COMBINATIONS GL ON GL.CODE_COMBINATION_ID = TXN.DISTRIBUTION_ACCOUNT_ID 
 AND GL.SEGMENT3 <> 945

WHERE TRANSACTION_DATE >= TRUNC(SYSDATE-30)
  AND  TRANSACTION_DATE < TRUNC(SYSDATE) 
  AND TXN.INVENTORY_ITEM_ID = 100002040645155                                
                                                                      
GROUP BY TXN.ORGANIZATION_ID, TXN.INVENTORY_ITEM_ID, TXN.SUBINVENTORY_CODE , TXN.DISTRIBUTION_ACCOUNT_ID
, GL.SEGMENT3  )

如果我将

GL_CODE_COMBINATIONS
切换为
INNER JOIN
,那么在下面的结果中,我会根据需要过滤掉 61012 和 15000 行,但随后它也会(底层)过滤掉上面的 3 个空白行,如下所示。如何确保我仍然包含空格,但过滤掉其他两个?

enter image description here

sql oracle
1个回答
0
投票

添加

WHERE
过滤器,检查
OUTER JOIN
是否不匹配任何内容或您的条件是否匹配:

SELECT ABS(ROUND((SUM(PRIMARY_QUANTITY)/30),2)) AS BURN_RATE,
       TXN.ORGANIZATION_ID,
       TXN.INVENTORY_ITEM_ID,
       TXN.SUBINVENTORY_CODE,
       TXN.DISTRIBUTION_ACCOUNT_ID,
       GL.SEGMENT3
FROM   INV_MATERIAL_TXNS TXN
       LEFT OUTER JOIN INV_TRANSACTION_TYPES_TL TYPE
       ON TYPE.TRANSACTION_TYPE_ID = TXN.TRANSACTION_TYPE_ID                                        
       LEFT OUTER JOIN GL_CODE_COMBINATIONS GL
       ON     GL.CODE_COMBINATION_ID = TXN.DISTRIBUTION_ACCOUNT_ID 
WHERE TRANSACTION_DATE >= TRUNC(SYSDATE-30)
AND   TRANSACTION_DATE < TRUNC(SYSDATE) 
AND   TXN.INVENTORY_ITEM_ID = 100002040645155                                
AND   (   GL.CODE_COMBINATION_ID IS NULL -- Only happens when OUTER JOIN does not match.
      OR GL.SEGMENT3 <> 945 )                                                                
GROUP BY
       TXN.ORGANIZATION_ID,
       TXN.INVENTORY_ITEM_ID,
       TXN.SUBINVENTORY_CODE,
       TXN.DISTRIBUTION_ACCOUNT_ID,
       GL.SEGMENT3  
© www.soinside.com 2019 - 2024. All rights reserved.