我正在编写一个Query,它组合了两个不同表中的列。我目前正在从CSV文件中读取数据并进行数据协调。字段如下 让我们将两个表称为债权人和托管人。债权人DB具有信用名称Trade_Acct_Number,两个不同的标识符称为trade_ID和action_ID。另一方面,takers表具有相应的Trading_Account_Num,它是两个不同的标识符trade_ID和action_ID。
以下是条件;记录主要与Trading_Acct_Numbers匹配。然后基于trading_Account_Num,我们进一步根据trade_ID和action_ID过滤数据。 Trade_ID是8个字符长;如果trade_ID的最后6个字符匹配,那么我们会反映这些数据;否则我们检查action_ID。
这是我当前的查询(用SQL Server CE编写)
SELECT
CR.CREDIT_NAME,
TK.TRADE_ACCT_NUM,
CR.CREDIT_REG_NUM,
TK.TRADE_ID,
TK.ACTION_ID
FROM [TAKER] TR
INNER JOIN [CREDITOR] CR
ON TR.TRADE_ACCT_NUM = CR.TRADE_ACCT_NUM
WHERE SUBSTRING([TRADE_ID],3,8) = SUBSTRING([TRADE_ID],3,8)
OR TR.ACTION_ID = CR.ACTION_ID
ORDER BT
TR.TRADE_ACCT_NUM
目前我的桌子上有以下问题。我获得了大约90%的我想要的匹配输出,但是Takers表中的一些行完全被省略了。有时会有一个基于帐号的匹配,但是TRADE_ID为null,并且Action_ID导致不输出该行。当Trade_Acct_Num和Action_ID都匹配但没有Trade_ID时,也没有输出。我尝试做一个左连接,然后是一个内连接,但它没有帮助我的情况。请帮忙解释一下。感谢
答案 0 :(得分:1)
LEFT join只为您的所有债权人字段提供空值。您只需要考虑trade_id中的空值或联合债权人表中的credit_id。正如迈克上面提到的,一些示例数据会有所帮助。
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_id是否为空,如果是,则返回tr.trade_id,使其评估为true,然后继续以相同的方式测试credit_id。
答案 1 :(得分:0)
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