繁体   English   中英

通过内部联接或左/右联接替换与标量子查询的比较

[英]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 BYGROUP 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 KEYUNIQUE NOT NULL )或FOREIGN KEY约束,则我们可能会知道不会有错误。 当您知道不会有错误时,则应声明相应的约束。

尽管这个新查询可能是您真正想要的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM