【问题标题】:What is the proper syntax for a cross-table SQL query?跨表 SQL 查询的正确语法是什么?
【发布时间】:2008-10-28 18:49:27
【问题描述】:

现在,我有

SELECT gp_id FROM gp.keywords 
WHERE keyword_id = 15 
AND (SELECT practice_link FROM gp.practices 
     WHERE practice_link IS NOT NULL 
     AND id = gp_id)

这不会提供语法错误,但是对于应该返回行的值,它只返回 0 行。

我要做的是从 gp.keywords 获取 gp_id,其中关键字表 keyword_id 列是特定值,而 practice_link 是实践表对应于我拥有的 gp_id,它存储在 id该表的列。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我什至不确定这是有效的 SQL,所以我很惊讶它完全可以工作:

    SELECT gp_id
    FROM gp.keywords
    WHERE keyword_id = 15
        AND (SELECT practice_link FROM gp.practices WHERE practice_link IS NOT NULL AND id = gp_id)
    

    这个怎么样:

    SELECT kw.gp_id, p.practice_link
    FROM gp.keywords AS kw
    INNER JOIN gp.practices AS p
        ON p.id = kw.gp_id
    WHERE kw.keyword_id = 15
    

    我会避开其他示例中的隐式连接。以后只会让人流泪。

    【讨论】:

      【解决方案2】:

      
      select k.gp_id 
      from gp.keywords as k,
           gp.practices as p
      where
      keyword_id=15
      and practice_link is not null
      and p.id=k.gp_id
      

      【讨论】:

      • 比我快 5 秒 :) 我想知道最后执行 p.id = k.gp_id 与将其作为第一个 where 子句是否有任何优势。跨度>
      • 通常不会有任何区别,因为优化器会处理它,但请检查您的执行计划。
      • 我们甚至把表名缩写成一样的!现代 DBMS 应该没有区别,它们使用基于成本而不是基于顺序的优化器。如果您改用 join 子句,可能会有所不同,但这也主要是语法上的,而不是功能上的。
      • @Guido - where 子句的排序肯定会对性能产生影响。既然有join,就应该把join条件移到FROM子句中,让优化器选择最好的plan,更容易阅读。
      • @StingyJack - 我经常将内容移到 INNER JOIN 的 JOIN 子句中,但是,根据我的经验,优化器总是很聪明,足以在执行计划中有效地做到这一点。
      【解决方案3】:
      SELECT k.gp_id
      FROM gp.keywords k, gp.practices p
      WHERE 
         p.id = k.gp_id.AND
         k.keyword_id = 15 AND
         p.practice_link is not null
      

      【讨论】:

        【解决方案4】:
        SELECT g.gp_id, p.practice_link FROM gp.keywords g, gp.practices p 
        WHERE
        g.keyword_id = 15 AND p.practice_link IS NOT NULL AND p.id = g.gp_id
        

        【讨论】:

          猜你喜欢
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 2011-12-25
          • 1970-01-01
          • 2017-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多