[英]Replace comparison to scalar subquery by inner join or left/right join
我需要使用内部联接或右/左联接来编写此查询,但是我不知道如何开始:
select * from radicados where asignado =
(select estudianteid from estudiantes where usuario =
(select usuarioid from usuarios where nombre = $nombre_usuario))
但是我不知道如何对联接执行相同操作。
我认为这一定是这样的:
select * from radicados inner join usuarios on usuarioid=usuario
看来您想要这样的东西:
select radicados.*
from
radicados
join estudiantes
on radicados.asignado = estudiantes.estudianteid
join usarios
on estudiantes.usario = usarios.usarioid
where usarios.nombre = $nombre_usuario
在构造这样的查询时,请FROM
子句开始。 根据它们之间的关系,将包含所需数据的各种表连接在一起。 如果需要,添加一个WHERE
子句,描述要在其上过滤联接结果的任何其他条件。 然后根据需要填写SELECT
列表。
在某些情况下,您可能还需要添加其他子句( ORDER BY
, GROUP BY
等),但是一旦您了解了基本查询,这还不错。
这和
SELECT estudiantes.* FROM radicados
JOIN estudiantes ON estudianteid = asignado
JOIN usuarioid ON usuarioid = usuario
WHERE nombre = $nombre_usuario
我在这里假设列名是唯一的。 如果不是,则必须在表名中添加表名。
不要从表中选择单个值。 考虑符合条件的行。 甚至最好将表视为包含使相应语句为true的 行,而将查询视为计算使相应语句为true的行 。 首先,您选择对帐单; 然后您编写与该语句相对应的查询。 这是设计查询的方法。
//*
all radicados columns of the rows where
a subrow is IN radicados AND a subrow is IN estudiantes
AND asignado = estudianteid
AND a subrow is IN usarios
AND usuarioid = usuario
AND nombre = $nombre_usuario
*//
select radicados.*
from radicados
join estudiantes on estudianteid = asignado
join usuarios on usarioid = usario
and nombre = $nombre_usuario
当原始查询没有报告运行时错误时,该查询将返回相同的行。 但这并不一定是等效查询,因为当给定用户号(usuarios nombre)的用户ID(usarios usuarioid)或所选学生ID(estudiantes estudianteid)的学生ID多个时,原始查询会报告运行时错误用户ID(ususarios usario)。
//*
all columns of the radicados rows where
asignado =
the one estudianteid shared by the estudiantes rows where
usuario =
the one usuarioid shared by the usuarios rows where
nombre = $nombre_usuario
*//
select * from radicados where asignado = (select estudianteid from estudiantes where usuario = (select usuarioid from usuarios where nombre = $nombre_usuario ) )
这是因为仅当SELECT
返回具有一列和一行的表时,表达式value = (SELECT ...)
不会出现运行时错误。 如果是这样,它将值与该表中的一个值进行比较,否则将产生错误。
如果您提供了表定义,并且声明了某些候选键( PRIMARY KEY
或UNIQUE NOT NULL
)或FOREIGN KEY
约束,则我们可能会知道不会有错误。 当您知道不会有错误时,则应声明相应的约束。
尽管这个新查询可能是您真正想要的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.