Несколько левых объединений Teradata Data Loss - PullRequest
0 голосов
/ 27 февраля 2020

Заранее благодарим за просмотр этого вопроса. У меня проблемы с получением запроса на возврат полных результатов.

Существует три таблицы: call_data, call_details, employee

Ни одна из таблиц не имеет первичных ключей.

Я запускаю с call_data и join call_details с достаточным количеством спецификаторов, чтобы предотвратить дублирование.

join call_detail as call_detail
on  call_data.callid = call_detail.callid 
AND call_detail.call_date between (call_data.segstart_d - interval '1' day) and (call_data.segstart_d + interval '1' day)
AND call_detail.segment = call_data.segment

Затем я присоединяю таблицу сотрудников к таблице call_data на основе ключа сотрудника

join EMP as ANS
ON  ans.avayaid = call_data.anslogin
AND call_data.segstart_d between ans.startdate and ans.enddate

Это дает 213 строк со всеми заполненными полями. Без дублирования

Когда я добавляю левое соединение из той же таблицы сотрудников, для которого был переведен вызов

left join EMP as TRANS_FROM
ON Trans_FROM.avayaid = call_data.origlogin
AND call_data.segstart_d between Trans_from.startdate and trans_from.enddate

, я получаю лишь несколько полей trans_from. Если я поменяю местами отвеченные и перенесенные из типов соединения, тогда все перенесенные из сотрудника данные будут заполнены, но в той же горстке вызовов ответ будет дан по полям. Что дает?

Первоначально я написал это как кучу левых соединений.

1 Ответ

0 голосов
/ 27 февраля 2020

Вот переписывание вашего запроса, насколько я понимаю:

SELECT * 
FROM call_data cd
INNER JOIN call_detail cdt ON cd.callid = cdt.callid -- Get call details
  AND cdt.segment = cd.segment AND cdt.call_date BETWEEN 
    (cd.segstart_d - INTERVAL '1' DAY) AND (cd.segstart_d + INTERVAL '1' DAY)
INNER JOIN emp ans ON ans.avayaid = cd.anslogin -- Get responder info
  AND cd.segstart_d BETWEEN ans.startdate AND ans.enddate
LEFT JOIN emp as tf ON tf.avayaid = cd.origlogin -- Get transfer info
  AND cd.segstart_d BETWEEN tf.startdate AND tf.enddate

Когда вы говорите «поменять местами отвеченные и перенесенные из типов соединения», вы имеете в виду изменить один из INNER JOIN на LEFT JOIN и наоборот?

A LEFT JOIN просто говорит "дайте мне любую подходящую информацию, если она существует". Вот почему вы получаете только несколько trans_from полей. Если вы измените trans_from объединение на INNER JOIN, то в вашем наборе результатов должно быть меньше строк, но все эти строки будут иметь данные trans_from.

Почему ваш answered Поля все еще заполнены даже после переключения на LEFT JOIN, это может означать, что все строки имеют соответствующие «отвеченные» данные, что делает их похожими на INNER JOIN.

...