我可以在子查询中对主键执行 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));
我对在 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));