#sql #ms-access #left-join
Вопрос:
У меня есть вопрос о SQL-запросе, который я пишу в Microsoft Access. У меня есть две таблицы, которые включают версию первичного ключа, к которой я пытаюсь присоединиться.
Первая таблица (табл. 1) содержит PK # в следующем формате: TORD46709NVSW. Последние четыре символа могут состоять из 3-4 букв и иметь множество комбинаций.
Вторая таблица (таблица 2) содержит PK # в следующем формате: TORD00046709. После TORD всегда есть три нуля (эти 4 символа всегда совпадают).
Я написал запросы, чтобы перевести эти два в следующий формат: TORD46709.
Таблица 1:
SELECT
LEFT ([PKT_NUMBER_SFX], 9) AS
TORD_NUMBER
FROM Table_1;
Таблица 2:
SELECT
LEFT ([Transfer ID], 4)
RIGHT ([Transfer ID], 5)
AS
TORD_NUMBER
FROM Table_2;
Мои проблемы в том, что сейчас я пытаюсь присоединиться к этим двум столам, но изо всех сил. Я пытаюсь написать вышеуказанные инструкции в подзапросе для присоединения, но теперь думаю, что мне, возможно, потребуется выполнить запрос на обновление таблицы перед присоединением. Я хотел бы избежать последнего.
SELECT QlikView_Report.PKT_NUMBER_SFX, Transfer_Orders_OLD.[Transfer ID]
FROM QlikView_Report
LEFT JOIN TORD_REPORT ON QlikView_Report.PKT_NUMBER_SFX = Transfer_Orders_OLD.[Transfer ID]
WHERE Transfer ID IN
(SELECT
LEFT ([Transfer ID], 4)
RIGHT ([Transfer ID], 5)
AS
TORD_NUMBER
FROM Transfer_Orders_OLD) AND
(SELECT
LEFT ([PKT_NUMBER_SFX], 9) AS
TORD_NUMBER
FROM QlikView_Report);
Дайте мне знать, если вы считаете возможным присоединиться к этим несоответствующим ПК.
Комментарии:
1. Если это то, что вы делаете часто, или если таблица 1 очень большая, вам следует подумать о том, чтобы поместить ключ table2 в таблицу table1, где он может использовать индексы. Объединение двух таблиц по вычисляемым ключам неэффективно, а большие запросы могут выполняться очень медленно. Но если это всего лишь один случай, и ваша таблица содержит менее нескольких сотен тысяч строк, тогда не беспокойтесь.
2. Таблица 1 содержит около 75-80 тысяч строк плюс-минус, так как она меняется с течением времени. Я не вижу, чтобы он вырос более чем до нескольких сотен тысяч строк, так будет ли он по-прежнему работать довольно быстро?
Ответ №1:
Я изменил имя таблицы с QlikView_Report
на QlikView_Report_OG
в предложении from.
SELECT QlikView_Report_OG.[Pkt Ctl #], QlikView_Report_OG.[Customer PO], QlikView_Report_OG.[PKT_NUMBER_SFX], Transfer_Orders_OLD.[Origin],
Transfer_Orders_OLD.[Destination], Transfer_Orders_OLD.[Status], QlikView_Report_OG.[Item Desc],
QlikView_Report_OG.[Qty], QlikView_Report_OG.[Carton Number], QlikView_Report_OG.[Carton Status],
QlikView_Report_OG.[Load Number], QlikView_Report_OG.[Wave Number], QlikView_Report_OG.[Carton Tracking],
QlikView_Report_OG.[Cancellation], QlikView_Report_OG.[Trailer #] FROM QlikView_Report_OG
LEFT JOIN Transfer_Orders_OLD
ON LEFT (QlikView_Report.PKT_NUMBER_SFX, 9) = (LEFT (Transfer_Orders_OLD.[Transfer ID], 4) RIGHT (Transfer_Orders_OLD.[Transfer ID], 5));
Комментарии:
1. Ах, отличный улов. Спасибо тебе, Кази! Я также обновил QlikViewReport до версии OG после команды «СЛЕВА». Теперь это хорошо работает для меня! Спасибо за всю вашу помощь!
2. Мы вам очень рады. Если мой ответ помог, пожалуйста, примите его, нажав на зеленую галочку. Наилучшие пожелания.
Ответ №2:
В подзапросе нет необходимости. Используйте расчет непосредственно в условии соединения. Попробуйте это,
SELECT
q.PKT_NUMBER_SFX
, t.[Transfer ID]
FROM
QlikView_Report q
LEFT JOIN
Transfer_Orders_OLD t
ON LEFT (q.[PKT_NUMBER_SFX], 9) = (LEFT (t.[Transfer ID], 4) RIGHT (t.[Transfer
ID], 5))
Ответ №3:
Вам не нужен никакой подзапрос, но вам нужно сравнить оба столбца в предложении on левого соединения. Пожалуйста, попробуйте это.
SELECT QlikView_Report.PKT_NUMBER_SFX, Transfer_Orders_OLD.[Transfer ID]
FROM QlikView_Report
LEFT JOIN Transfer_Orders_OLD
ON LEFT (QlikView_Report.PKT_NUMBER_SFX, 9) = (LEFT (Transfer_Orders_OLD.[Transfer ID], 4) RIGHT (Transfer_Orders_OLD.[Transfer ID], 5));
Для каких строк условие будет соответствовать, вы получите данные в обоих столбцах, если условие не совпадает, то данные будут доступны только в столбце PKT_NUMBER_SFX.
Я проверил запрос в базе данных MS Access, и он работает так, как нужно.
Комментарии:
1. Это сработало! Теперь я пытаюсь извлечь определенные столбцы из каждого отчета и получаю всплывающие окна диалоговых окон. Включу код в отдельный ответ.