【问题标题】:Correct MySQL JOIN format to avoid nested SELECT更正 MySQL JOIN 格式以避免嵌套 SELECT
【发布时间】:2009-12-01 04:14:55
【问题描述】:

我有两个单独的 SELECT 语句:

SELECT VCe.VId FROM `VCe` WHERE `YId` = 9007 AND `MaId` =76 AND `MoId` = 2851

SELECT r_pts.p_id FROM r_pts WHERE r_pts.v_id IN (57202, 57203, 69597, 82261, 82260, 69596, 69595, 82259)

当它们单独运行时,它们都在 0.05 秒内完成,但是当我将第一个嵌套在第二个中时,它会急剧增加到 3.3 秒。

我想做一个连接,以便我可以使用第一个选择作为 IN() 的结果集从第二个 SELECT 获取输出,但我不知道如何在 JOIN 中包含 WHERE 条件。

编辑:按照我的要求进行连接的正确语法是什么?

感谢您的帮助,不胜感激!

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    相当于MattMcKnight's query,同时说明“如何在JOIN 中包含WHERE 条件”:

    SELECT r.p_id 
    
      FROM r_pts r
    
           INNER JOIN VCe v
           ON v.VId = r.v_id
       AND 
           v.YId = 9007 
       AND 
           v.MaId = 76 
       AND 
           v.MoId = 2851
    

    【讨论】:

    • 好吧,我将更改我的代码以反映您的“长手”方法,以防数据库更改 sql 类型。
    • @razass:不客气。无论 RDBMS 是否更改,您都可能会发现显式方法更具可读性,尤其是在查询变得更复杂时;我知道我知道。
    • 隐式连接不适用于哪个数据库?我在 Oracle、SQLServer、MySQL、sqlite 等中使用过该语法。
    • INNER JOIN 是标准,但 JOIN 在 Oracle(9i+ IME)、SQL Server、MySQL(至少 4+)上被隐式接受
    • @MattMcKnight 和@OMG Ponies:感谢你们提供的信息。我已经删除了答案中的最后一句话。
    【解决方案2】:
    SELECT r_pts.p_id FROM r_pts, 'VCe' WHERE r_pts.v_id = VCe.VId AND VCe.YId = 9007 AND VCe.MaId =76 AND VCe.MoId = 2851
    

    连接的基本目标是描述两个表之间的关系。我从您的示例中推断出 r_pts 表中的 v_id 列是指向 VCe 表中 VId 主键的外键。当您在查询中添加一个术语(例如“r_pts.v_id = VCe.VId”)时,该术语具有您希望连接的每个表的字段,它告诉数据库如何匹配表之间的行以使“虚拟行”,其中包含两个表中的列。您的其他查询字词限制了结果集中包含哪些行。

    【讨论】:

    • 非常感谢您完美运行,现在您能否解释一下或指向我可以查看此语法的资源。
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多