我使用以下脚本:
SELECT autor.id_autor as 'ID de Autor',
autor.nom_autor as 'Nombre Autor',
CASE autor.id_autor
WHEN ISNULL(autor.pseudo_id = autor.id_autor ) THEN nom_autor
ELSE null
END
'Autor Real', -- nombre de la columna de la tabla
articulo.id_art as 'ID de Articulo',
articulo.nom_art as 'Nombre de Articulo'
FROM autor
LEFT JOIN art_aut ON (art_aut.id_autor = autor.id_autor)
LEFT JOIN articulo ON(articulo.id_art = art_aut.id_art);
显示aun作者的真实姓名。
我可以看到很多表,但我希望这些表能够“提供”下表,以便显示如下:
ID de Autor Nombre Autor Autor Real ID de Articulo Nombre Articulo
A3 Quijote Luis 1 El origen
我有一个名为autor的表,如下所示:
id_autor nom_autor RFC pseudo_id
A1 J Salinas ADAD12
A3 Quijote A7
A7 Luis LIDSDS
正如你可以看到表格引用自身,但我不知道我必须写什么样的指令,以便作者就像“Quijote”显示他们的真实姓名和那些没有其他名字的人一样Juanito Salinas保持不变,因为他们在pseudo_id列中没有记录
提前致谢!
答案 0 :(得分:0)
我不完全理解您的查询。
如果我理解正确,那么您的autor
表将作为名为pseudo_id
的列,这是一个引用同一表中id_autor
列的外键。
要检索相关行,您可以执行JOIN操作,可能需要“外部”连接,以便返回autor
个故事中的所有行,以及“匹配”行(如果有)
例如:
SELECT a.id_autor
, a.nom_autor
, r.nom_autor AS `Autor Real`
, ...
FROM autor a
LEFT
JOIN autor r ON r.id_autor = a.pseudo_id
当找到匹配的行时,Autor Real
值将具有来自引用行(nom_autor
)的r
列的值,否则它将为NULL。
这里的“技巧”是你需要对查询中的autor
表进行第二次引用以检索第二行(相关)。就像对autor
表的第二次引用是对不同的表一样,就像查询引用的任何其他表一样。
作为另一种(通常性能较差)替代方案,您可以使用相关子查询代替JOIN操作。
例如:
SELECT a.id_autor
, a.nom_autor
, ( SELECT r.nom_autor
FROM autor r
WHERE r.id_autor = a.pseudo_id
ORDER BY r.nom_autor
LIMIT 1
) AS `Autor Real`
, ...
FROM autor a
这是SELECT列表中的“相关”子查询。该查询引用外部查询中的列,并为外部查询返回的每一行执行该子查询。)如果子查询未返回值,则外部查询返回NULL值。
(注意:您的查询中可能不需要ORDER BY
和LIMIT
条款。特别是id_autor
列在autor
表格中是唯一的。它们包括在内这里是为了演示更一般的情况,其中可能存在多个“匹配”行; SELECT列表中的子查询只允许返回单个表达式和单个行.LIMIT 1子句将其限制为单行,ORDER BY
确定将返回哪些可能的值。)