我应该对此MySQL查询使用哪个连接?

时间:2019-10-16 23:12:10

标签: mysql outer-join

我有一个具有特定TraceID的表'PR',另一个名为'BA'的表具有'PAYMENT_ID'和(有时)我必须从列'MISC'中提取的TraceID值以匹配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  

我在BA中只获得具有匹配TraceID的PR行。

现在,我应该如何修改查询以从BA(具有相同的TraceID)中获取所有PR记录及其对应的PAYMENT_ID,还可以从BA中获取所有不具有匹配TraceID的PAYMENT_ID行?

我想我应该有一种UNION然后加入,但是我所有的尝试都失败了

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

您真正想要的是一个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