Awa*_*ias 1 postgresql join sql-standard
下面的两个查询中,哪个对 postgresql 来说最有效?并且在可读性等方面具有更好的风格。
区别在于语句的位置doctor.type != 'surgeon'
在 WHERE 子句中:
SELECT practice.name, doctor.name
FROM doctor
JOIN practice ON (doctor_code = code)
WHERE doctor.name LIKE '%son'
AND (doctor.type != 'surgeon');
Run Code Online (Sandbox Code Playgroud)
或者在 JOIN 子句中:
SELECT practice.name, doctor.name
FROM doctor
JOIN practice ON (doctor_code = code AND doctor.type != 'surgeon')
WHERE doctor.name LIKE '%son';
Run Code Online (Sandbox Code Playgroud)
说到风格,你可以在几个地方进行改进:
除了克雷格已经写过的内容之外。
如果一个条件只涉及子句doctor中的表JOIN,而另一个条件则在WHERE子句中,这是不一致的。保持一致,要么两者都一致,要么都没有。最好将它们放入WHERE子句中,而链接两个表的条件放入JOIN子句中 - 可能会使用 进行简化USING。见下文。
doctor.name对某些列 ( 、 )进行表限定doctor.type,但对其他列 ( code) 进行表限定也是不一致的。在较大的查询中,最好始终对所有列进行表限定,以避免命名冲突并使代码清晰。
“名字”不是一个好名字。你应该很少使用它。使用有意义的标识符,不要在每个表中重复。一旦你连接了几个表(这就是你在 SQL 中一直做的事情),你最终会得到多个名为“name”的列,并且必须处理列别名才能使用它。“id”或“code”同样是糟糕的选择。
按照下面的建议使用描述性标识符。
doctor.code这是使用and的反模式practice.doctor_code。一些不太聪明的 ORM 习惯于使用这个 - 这并不是一个好主意。除了“代码”是一个不好的标识符之外,最好的做法是对具有相同数据的列使用相同的名称。两个地方都用。或者更确切地说:因为它可能是一个“标识符”而不是“代码”(错误的术语)。这种命名约定还允许在 join 中使用方便的构造。doctor_codedoctor_idUSING
使用 SQL 标准<>而不是(也支持)!=.
使用表别名可以缩短代码并保持可读性。
所有的东西放在一起,可能看起来像这样:
SELECT p.practice, d.name -- for a person, "name" is halfway sensible
FROM doctor d
JOIN practice p USING (doctor_id)
WHERE d.name LIKE '%son'
AND d.doc_type <> 'surgeon';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1877 次 |
| 最近记录: |