我可以在子查询中对主键执行 Left Join 吗?

Can I perform a Left Join on Primary Keys in a subquery?

我对在 Microsoft Access 中编写的 SQL 查询有疑问。我有两个 table,其中包含一个主键版本,我正在尝试加入它们。

第一个 table (Table1) 包括 PK #,格式如下:TORD46709NVSW。最后四个字符可以是3-4个字母,有多种组合。

第二个 table (Table 2) 包含 PK #,格式如下:TORD00046709。 TORD后面总是三个零(这4个字符总是一致的)。

我已经编写了查询以将这两个格式转换为以下格式:TORD46709。

Table 1:

SELECT

 LEFT ([PKT_NUMBER_SFX], 9) AS

TORD_NUMBER

FROM Table_1;

Table 2:

SELECT

LEFT ([Transfer ID], 4) +

RIGHT ([Transfer ID], 5)

AS

TORD_NUMBER

FROM Table_2;

我的问题是,我现在正尝试加入这两个 table,但遇到困难。我试图在子查询中编写上述语句以便加入,但现在我想我可能需要在加入之前执行更新 table 查询。我想避免后者。

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);

如果您认为可以加入这些不匹配的 PK,请告诉我。

您不需要任何子查询,但需要比较左联接的 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 数据库中的查询,它正在按预期工作。

不需要子查询。直接在连接条件中使用计算。 试试这个,

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))

我已将 from 子句中的 table 名称从 QlikView_Report 更改为 QlikView_Report_OG

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));