Могу ли я выполнить Левое объединение первичных ключей в подзапросе?

#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. Это сработало! Теперь я пытаюсь извлечь определенные столбцы из каждого отчета и получаю всплывающие окна диалоговых окон. Включу код в отдельный ответ.