用内部联接或 left/right 联接替换与标量子查询的比较
Replace comparison to scalar subquery by inner join or left/right join
我需要使用内部联接或 right/left 联接来编写此查询,但我不知道如何开始:
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
我在这里假设列名是唯一的。如果不是,您必须将 table 名称添加到字段名称。
不要考虑从 table 中挑选单个值。考虑符合条件的行。更好的做法是将 table 视为持有 使相应语句为真 的行,并将查询视为计算 使相应语句为真 的行].首先你选择声明;然后编写与该语句相对应的查询。 Here is how to design queries.
//*
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
当您的原始查询报告没有运行时错误时,此查询 returns 相同的行。但它不一定是等效查询,因为当给定用户编号 (usarios nombre) 有多个用户 ID (usarios usuarioid) 或所选用户有多个学生 ID (estudiantes estudianteid) 时,您的原始查询会报告运行时错误用户 id (usuarios 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
)
)
这是因为表达式 value = (SELECT ...)
只有在 SELECT
returns a table 时才没有运行时错误一列和一行。如果是这样,它将 value 与 table 中的一个值进行比较,否则会给出错误。
如果您给出了 table 定义并且声明了某些候选键(PRIMARY KEY
或 UNIQUE NOT NULL
)或 FOREIGN KEY
约束,那么我们可能知道会有没有错误。当你知道不会有错误时,你应该声明相应的约束。
尽管这个新查询可能是您真正想要的查询。
我需要使用内部联接或 right/left 联接来编写此查询,但我不知道如何开始:
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
我在这里假设列名是唯一的。如果不是,您必须将 table 名称添加到字段名称。
不要考虑从 table 中挑选单个值。考虑符合条件的行。更好的做法是将 table 视为持有 使相应语句为真 的行,并将查询视为计算 使相应语句为真 的行].首先你选择声明;然后编写与该语句相对应的查询。 Here is how to design queries.
//*
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
当您的原始查询报告没有运行时错误时,此查询 returns 相同的行。但它不一定是等效查询,因为当给定用户编号 (usarios nombre) 有多个用户 ID (usarios usuarioid) 或所选用户有多个学生 ID (estudiantes estudianteid) 时,您的原始查询会报告运行时错误用户 id (usuarios 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 ) )
这是因为表达式 value = (SELECT ...)
只有在 SELECT
returns a table 时才没有运行时错误一列和一行。如果是这样,它将 value 与 table 中的一个值进行比较,否则会给出错误。
如果您给出了 table 定义并且声明了某些候选键(PRIMARY KEY
或 UNIQUE NOT NULL
)或 FOREIGN KEY
约束,那么我们可能知道会有没有错误。当你知道不会有错误时,你应该声明相应的约束。
尽管这个新查询可能是您真正想要的查询。