2014-10-07 5 views
0

Я пишу запрос, который объединяет столбцы из двух разных таблиц. В настоящее время я читаю данные из файла CSV и выполняю сверку данных. Поля следующие: Назовем обе таблицы Кредиторами и Takers. БД кредиторов имеет кредитное имя Trade_Acct_Number, два разных идентификатора, называемых trade_ID и action_ID. С другой стороны, таблица получателей имеет соответствующий Trading_Account_Num, и это два разных идентификатора trade_ID и action_ID.Проблема с Inner и Left Join

Вот условия; записи должны быть сопоставлены главным образом на Trading_Acct_Numbers. Затем, основываясь на trade_Account_Num, мы далее фильтруем данные на основе trade_ID и action_ID. Trade_ID - 8 символов; Если на последних 6 символах trade_ID есть совпадение, мы отражаем эти данные; иначе мы проверим action_ID.

Вот мой текущий запрос (Написанный в SQL 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

Ваш пример отсутствует CR. и TR. по проверке подстроки. Можете ли вы опубликовать пример данных, которые, по вашему мнению, должны появиться, но нет? – Mike

+0

Кстати, вы можете попробовать: alter table [TAKER] добавить TRADE_MATCH AS SUBSTRING ([TRADE_ID], 3,6), чтобы создать псевдо-поле, в которое вы можете добавить индекс, чтобы ускорить этот запрос. – Mike

ответ

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 так будет вычисляться верно, а затем перейти, чтобы проверить credit_id таким же образом.

0

@Victor, я подумал о другой возможности в зависимости от вашей даты. Если trade_id из обеих таблиц имеет значение 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 
Смежные вопросы