下面的SQL语句中是否可以省略"WHERE"?
Can "WHERE" be omitted in the following SQL statement?
我正在尝试动态构建应该如下所示的查询:
SELECT *
FROM candidate_info
INNER JOIN candidate_job ON info_uniqid = job_info_uniqid
INNER JOIN candidate_status ON info_uniqid = status_info_uniqid
WHERE 1 = 1
AND status_status = :status_status
我无意中发现,如果我省略 WHERE
子句,查询就可以正常工作:
SELECT *
FROM candidate_info
INNER JOIN candidate_job ON info_uniqid = job_info_uniqid
INNER JOIN candidate_status ON info_uniqid = status_info_uniqid
AND status_status = :status_status
你能帮我理解一下吗:
- 为什么查询仍然有效?
- 使用没有
WHERE
子句的查询有什么风险?
注意:选择 WHERE 1 = 1
是为了简单。
非常感谢!
查询有效,因为您已将条件从 WHERE
子句移至 ON
子句。
因为你用的是INNER JOIN
,效果是完全一样的。这两个查询做同样的事情,应该有相同的执行计划。
我建议您对列名进行限定,这样 table 它们的来源就很清楚了。我猜该专栏来自 candidate_status
。如果是这样,将其放在 on
子句中更多是风格问题。
您可以向 JOIN ON
添加不止一个条件,这就是您正在做的事情。你
INNER JOIN candidate_status ON
(
info_uniqid = status_info_uniqid AND status_status = :status_status
)
我正在尝试动态构建应该如下所示的查询:
SELECT *
FROM candidate_info
INNER JOIN candidate_job ON info_uniqid = job_info_uniqid
INNER JOIN candidate_status ON info_uniqid = status_info_uniqid
WHERE 1 = 1
AND status_status = :status_status
我无意中发现,如果我省略 WHERE
子句,查询就可以正常工作:
SELECT *
FROM candidate_info
INNER JOIN candidate_job ON info_uniqid = job_info_uniqid
INNER JOIN candidate_status ON info_uniqid = status_info_uniqid
AND status_status = :status_status
你能帮我理解一下吗:
- 为什么查询仍然有效?
- 使用没有
WHERE
子句的查询有什么风险?
注意:选择 WHERE 1 = 1
是为了简单。
非常感谢!
查询有效,因为您已将条件从 WHERE
子句移至 ON
子句。
因为你用的是INNER JOIN
,效果是完全一样的。这两个查询做同样的事情,应该有相同的执行计划。
我建议您对列名进行限定,这样 table 它们的来源就很清楚了。我猜该专栏来自 candidate_status
。如果是这样,将其放在 on
子句中更多是风格问题。
您可以向 JOIN ON
添加不止一个条件,这就是您正在做的事情。你
INNER JOIN candidate_status ON
(
info_uniqid = status_info_uniqid AND status_status = :status_status
)