Join 内部联接和左联接存在问题

Join 内部联接和左联接存在问题,join,Join,我正在编写一个将两个不同表中的列组合在一起的查询。我目前正在从CSV文件读取数据并进行数据核对。字段如下所示 让我们称之为债权人和接受者。债权人DB有信贷名称、交易账号、两个不同的标识符,分别称为交易ID和行动ID。另一方面,takers表有一个对应的交易账号,它是两个不同的标识符,分别为交易ID和行动ID 这里是条件;记录主要根据交易账户编号进行匹配。然后根据交易账户编号,我们进一步根据交易ID和行动ID过滤数据。交易ID的长度为8个字符;如果交易ID的最后6个字符匹配,则我们反映该数据;否则

我正在编写一个将两个不同表中的列组合在一起的查询。我目前正在从CSV文件读取数据并进行数据核对。字段如下所示 让我们称之为债权人和接受者。债权人DB有信贷名称、交易账号、两个不同的标识符,分别称为交易ID和行动ID。另一方面,takers表有一个对应的交易账号,它是两个不同的标识符,分别为交易ID和行动ID

这里是条件;记录主要根据交易账户编号进行匹配。然后根据交易账户编号,我们进一步根据交易ID和行动ID过滤数据。交易ID的长度为8个字符;如果交易ID的最后6个字符匹配,则我们反映该数据;否则我们检查动作ID

这是我当前的查询(用SQL Server CE编写)


目前在我的表格中,我有以下问题。我得到了90%的匹配输出,但是Takers表中的一些行被完全忽略了。有时会根据账号进行匹配,但交易ID为null,操作ID导致行不输出。当Trade_Acct_Num和Action_ID上都匹配,但Trade_ID上没有匹配时,也没有输出。我尝试先进行左连接,然后进行内部连接,但这对我的情况没有帮助。请帮忙解释一下。谢谢

左连接只会为所有字段提供空值。您只需要考虑您的trade_id或您的credit_id在联接债权人表中为空的可能性。正如Mike上面提到的,一些示例数据会很有帮助

SELECT
CR.CREDIT_NAME,
TR.TRADE_ACCT_NUM,
CR.CREDIT_REG_NUM,
TR.TRADE_ID,
TR.ACTION_ID

FROM [TAKER] TR
INNER JOIN [CREDITOR] CR
ON TR.TRADE_ACCT_NUM = CR.TRADE_ACCT_NUM
WHERE SUBSTRING(TR.TRADE_ID,3,8) = CASE WHEN CR.TRADE_ID is null 
      then SUBSTRING(TR.TRADE_ID,3,8) ELSE SUBSTRING(CR.TRADE_ID,3,8) END
OR TR.ACTION_ID = CASE WHEN CR.ACTION_ID is null 
      then TR.ACTION_ID else CR.ACTION_ID end
ORDER BT
TR.TRADE_ACCT_NUM

这只是检查cr.trade\u id是否为空,如果为空,则返回tr.trade\u id,使其计算为true,然后以相同的方式继续测试信用id。

@Victor,我考虑了另一种可能性,具体取决于您的日期。如果两个表的trade_id都为null,则必须测试两者是否为null,因为null不等于null。我希望其中一个答案能满足你的需要

SELECT
CR.CREDIT_NAME,
TR.TRADE_ACCT_NUM,
CR.CREDIT_REG_NUM,
TR.TRADE_ID,
TR.ACTION_ID

FROM [TAKER] TR
INNER JOIN [CREDITOR] CR
ON TR.TRADE_ACCT_NUM = CR.TRADE_ACCT_NUM AND
    (  SUBSTRING(TR.TRADE_ID,3,8) = SUBSTRING(CR.TRADE_ID,3,8)
    OR (TR.TRADE_ID is null and CR.TRADE_ID is null)
    OR TR.ACTION_ID = CR.ACTION_ID
    OR (TR.ACTION_ID is null and CR.ACTION_ID is null)
    )
ORDER TR.TRADE_ACCT_NUM

您的示例在子字符串检查中缺少CR.和TR。您可以发布一个您认为应该出现但没有出现的数据示例吗?顺便说一句,您可能希望尝试:alter table[TAKER]add TRADE_MATCH AS SUBSTRING([TRADE_ID],3,6),以创建一个伪字段,然后向其中添加索引以加速此查询。
SELECT
CR.CREDIT_NAME,
TR.TRADE_ACCT_NUM,
CR.CREDIT_REG_NUM,
TR.TRADE_ID,
TR.ACTION_ID

FROM [TAKER] TR
INNER JOIN [CREDITOR] CR
ON TR.TRADE_ACCT_NUM = CR.TRADE_ACCT_NUM AND
    (  SUBSTRING(TR.TRADE_ID,3,8) = SUBSTRING(CR.TRADE_ID,3,8)
    OR (TR.TRADE_ID is null and CR.TRADE_ID is null)
    OR TR.ACTION_ID = CR.ACTION_ID
    OR (TR.ACTION_ID is null and CR.ACTION_ID is null)
    )
ORDER TR.TRADE_ACCT_NUM