跨表 SQL 查询的正确语法是啥?

Posted

技术标签:

【中文标题】跨表 SQL 查询的正确语法是啥?【英文标题】: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该表的列。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于跨表 SQL 查询的正确语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中SOURCE命令的正确语法是啥

MySQL基础语法之多表连接查询

php中for和SQL更新的正确语法是啥?

.htaccess 中带有查询字符串的 301 的正确语法是啥? [关闭]

我的更新 sql 查询一直说语法错误,但我不知道它是啥

VBA代码中WHERE关键字的正确语法语法是啥