【问题标题】:Can I perform a Left Join on Primary Keys in a subquery?我可以在子查询中对主键执行左连接吗?
【发布时间】:2021-08-22 18:44:33
【问题描述】:

我有一个关于我在 Microsoft Access 中编写的 SQL 查询的问题。我有两个表,其中包含我尝试加入的主键版本。

第一个表 (Table1) 包含以下格式的 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);

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

【问题讨论】:

  • 如果这是你经常做的事情,或者如果 table1 非常大,你应该考虑将 table2 键放入 table1 表中,它可以利用索引。在计算键上连接两个表效率低下,大型查询可能会变得非常慢。但是,如果它只是一次性的并且您的表少于几十万行,那么请不要打扰。
  • 表 1 大约有 75-80k 行,随着时间的推移而变化。我没有看到它增长到超过几十万行,所以它仍然会运行得相当快吗?

标签: sql ms-access left-join


【解决方案1】:

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

【讨论】:

  • 成功了!现在我正在尝试从每个报告中提取特定列,并且正在弹出对话框。将在单独的答案中包含代码。
【解决方案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】:

    我已在 from 子句中将表名从 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));
    

    【讨论】:

    • 啊,太好了。谢谢你,卡兹!我还在 ON LEFT 命令之后将 QlikViewReport 更新为 OG 版本。现在这对我来说很好用!感谢您的所有帮助!
    • 不客气。如果我的回答有帮助,请单击绿色复选标记接受。最良好的祝愿。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2021-06-14
    • 2013-05-18
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多