【发布时间】:2015-07-15 18:01:09
【问题描述】:
我希望更正 mySQL 数据库中左连接的语法。我的查询运行但很慢,我不确定我的左连接是否正确。我需要根据以前的成功选择 consumer_id。为了检查以前的成功,我必须在记录表和映射表上留下连接,以将映射 ID 链接到仅存在于 event_queue 表中的消费者 ID。非常感谢您的帮助。
第一个查询:
SELECT
CEQ.consumer_ID
, F.client_license_ID
, F.footprint_ID
, F.event_token_ID
, EM.event_ID
, EM.mapping_ID em_ID
, EM.export_value campaign_number
, EM.export_value_2 sequence_number
, EM.export_value_3 campaign_number_2
, EM.export_value_4 sequence_number_2
, EM.export_value_5 ffs_event_id
, EM.export_value_6
, EM.export_value_7
, EM.export_value_8
, EM.export_value_9
, EM.export_value_10
FROM data_transfer.Event_Mappings EM
JOIN data_transfer.Event_Queue CEQ ON CEQ.event_ID = EM.event_ID
JOIN Footprints F ON CEQ.consumer_ID = F.consumer_ID
LEFT JOIN efn_data_transfer.CRM_Records LCR ON LCR.consumer_ID = CEQ.consumer_ID
WHERE EM.data_transfer_ID = 24
AND EM.mode = 'production'
AND EM.active_flag = 1
AND F.sample_flag = 0
AND CEQ.modify_DTM > (SELECT last_transfer FROM (SELECT CAST(DATE_SUB(start,INTERVAL 3 DAY) AS CHAR) last_transfer
FROM data_transfer.DT_Runs DTR
WHERE DTR.data_transfer_ID = 24
AND DTR.result = 1
AND DTR.mode = 'production'
ORDER BY DTR.dt_run_ID DESC
LIMIT 1)as D
)
GROUP BY
CEQ.consumer_ID
, F.client_license_ID
, F.footprint_ID
, F.event_token_ID
, EM.event_ID
, EM.mapping_ID
, EM.export_value
, EM.export_value_2
, EM.export_value_3
, EM.export_value_4
, EM.export_value_5
, EM.export_value_6
, EM.export_value_7
, EM.export_value_8
, EM.export_value_9
, EM.export_value_10
ORDER BY F.client_license_ID, CEQ.consumer_ID, EM.mapping_ID, CEQ.modify_DTM;
组合查询:
SELECT DISTINCT CAST(CEQ.consumer_ID AS CHAR) AS consumer_ID_1
FROM data_transfer.Event_Queue CEQ
WHERE 0=0
AND CEQ.consumer_ID NOT IN (SELECT RR.consumer_ID FROM data_transfer.Records RR
JOIN data_transfer.Event_Mappings EM ON RR.event_mapping_ID = EM.event_mapping_ID
WHERE 0=0
AND RR.failure_code = 0
AND RR.mode = 'production'
AND RR.`ignore` = 0
AND RR.response_code = 'SUCCESS'
AND RR.data_transfer_ID = 24
AND RR.consumer_ID = ?
AND EM.event_ID = ?
)
AND CEQ.consumer_ID = ?
尝试的查询:
SELECT
DISTINCT
EM.event_ID
, F.footprint_ID
, F.event_token_ID
FROM data_transfer.Event_Mappings EM
JOIN data_transfer.Event_Queue CEQ ON CEQ.event_ID = EM.event_ID
JOIN Footprints F ON CEQ.consumer_ID = F.consumer_ID
LEFT JOIN efn_data_transfer.CRM_Records LCR ON LCR.consumer_ID = CEQ.consumer_ID
LEFT JOIN (
SELECT DISTINCT CEQ.consumer_ID AS consumer_ID_1
FROM data_transfer.Event_Queue CEQ, data_transfer.Records RR
LEFT JOIN data_transfer.Mappings EM ON EM.mapping_id = RR.mapping_id
WHERE RR.consumer_id = CEQ.consumer_id
AND RR.failure_code = 0
AND RR.mode = 'production'
AND RR.`ignore` = 0
AND RR.response_code = 'SUCCESS'
AND RR.data_transfer_ID = 24
) AS RECORDS ON CEQ.consumer_id
WHERE EM.data_transfer_ID = 24
AND EM.mode = 'production'
AND EM.active_flag = 1
AND F.sample_flag = 0
AND CEQ.modify_DTM > (SELECT last_transfer FROM (SELECT CAST(DATE_SUB(start,INTERVAL 3 DAY) AS CHAR) last_transfer
FROM data_transfer.DT_Runs DTR
WHERE DTR.data_transfer_ID = 24
AND DTR.result = 1
AND DTR.mode = 'production'
ORDER BY DTR.dt_run_ID DESC
LIMIT 1) AS D
)
GROUP BY
CEQ.consumer_ID
, F.client_license_ID
, F.footprint_ID
, F.event_token_ID
, EM.event_ID
, EM.mapping_ID
, EM.export_value
, EM.export_value_2
, EM.export_value_3
, EM.export_value_4
, EM.export_value_5
, EM.export_value_6
, EM.export_value_7
, EM.export_value_8
, EM.export_value_9
, EM.export_value_10
ORDER BY F.client_license_ID, CEQ.consumer_ID, EM.mapping_ID, CEQ.modify_DTM;
【问题讨论】:
-
尝试消除 where 子句中的依赖子查询,并仅使用连接重写您的查询