Какое соединение я должен использовать для этого запроса MySQL? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть таблица 'PR', которая имеет определенный TraceID, а другая таблица с именем 'BA' имеет 'PAYMENT_ID' и (иногда) значение TraceID, которое я должен извлечь из столбца "MISC", чтобы затем соответствовать BAи PR Trace_ID.

Теперь некоторые записи в BA не имеют TraceID после извлечения, НО мне все еще нужно, чтобы эти записи отображались в виде строк.

Таблица PR:

TraceID
178000
178001
178002
178003

таблица BA

PAYMENT_ID, MISC
100, AAA/TraceID=178000
101, BBB/TraceID=178001
102, Ref
103, CCC/TraceID=178002
104, Ref2
105, CCC/TraceID=178003

мой вывод должен быть:

TraceID, PAYMENT_ID
178000, 100
178001, 101
NULL, 102
178002, 103
NULL, 104

и т. Д.

Я использую этот запрос:

   select * from
    (select TraceID from PR) PR
    left join 
    (select 
     PAYMENT_ID , if (locate('TraceId=',MISC)>0,SUBSTRING_INDEX(MISC,'TraceId=',-1),'') as traceID from BankingActivity ) BA
     on PR.TraceID = BA.traceID  

Я только получаю PR строки с совпадающим TraceID в BA.

Теперь, как мне изменить запрос, чтобы получить все записи PR и соответствующие им PAYMENT_ID из BA (имеющие одинаковый TraceID), но также и все строки PAYMENT_ID из BA без соответствующего TraceID?

Iдумаю, у меня должен быть своего рода UNION, а затем присоединиться, но все мои попытки потерпели неудачу

спасибо за ваши предложения.

1 Ответ

0 голосов
/ 17 октября 2019

То, что вы на самом деле хотите, это RIGHT JOIN, или, альтернативно, сначала перезапишите запрос с таблицей BA:

SELECT BA.PAYMENT_ID, PR.*
FROM (SELECT PAYMENT_ID,
      IF (LOCATE('TraceId=',MISC)>0,SUBSTRING_INDEX(MISC,'TraceId=',-1),'') AS traceID
      FROM BankingActivity) BA
LEFT JOIN PR ON PR.TraceID = BA.traceID
...