如何查询多个表以获取表具有相同列名的记录
Posted
技术标签:
【中文标题】如何查询多个表以获取表具有相同列名的记录【英文标题】:How to query multiple tables for a record where tables have identical column names 【发布时间】:2019-11-06 14:25:16 【问题描述】:我有一个包含两个表、交换机和路由器的数据库。两个表中的列具有相同的名称(dev_name、dev_ip 等)。
我需要知道如何查询这两个表并找到具有特定主机名的单个记录。因此,如果我的 php 表单是通过设备名称查询数据库,我想查询整个数据库(所有表)并找到具有被查询设备的表/行。
我试过这样的查询:
SELECT * FROM switches,routers
WHERE switches.dev_name = 'coreswitch01' OR routers.dev_name = 'core01switch';
但它给了我一个串联的输出,其中包括路由器表中的每个路由器和 coreswitch01 重复。
SELECT * FROM switches,routers
WHERE switches.dev_name = 'coreswitch01' OR routers.dev_name = 'core01switch';
我希望构建的是一个查询,它读取两个表并找到 coreswitch01 的记录,然后只向我显示它找到的任何表中的一条记录。
【问题讨论】:
只是为了帮助您理解为什么会看到您所看到的结果,两个表名之间的,
是JOIN
查询的简写语法;这就是行连接的来源;此外,如果没有 JOIN
条件,您的结果是笛卡尔连接,这就是重复的来源; HTH; Mureinik 的答案是您想要实际实现的目标的出色而简洁的答案
【参考方案1】:
您可以使用union all
集合运算符:
SELECT *
FROM (SELECT * FROM switches
UNION ALL
SELECT * FROM routers) t
WHERE dev_name = 'coreswitch01'
【讨论】:
这个公式将对所有数据进行 3 次完整传递——一次查找每个表中的所有行,第二次将它们写入临时表,第三次搜索联合国- 所需行的索引临时表。非常低效。【参考方案2】:每当我看到两个表具有相同(或几乎相同)的列时,我都会问“为什么这两个表没有合并到一个表中?”您可能需要一个额外的列来说明它是哪种东西(路由器与交换机),但这是一个很小的开销。
但是,鉴于您有 2 张桌子...
对于您的特定查询,这是最佳选择:
( SELECT * FROM switches WHERE dev_name = 'coreswitch01' )
UNION ALL
( SELECT * FROM routers WHERE dev_name = 'coreswitch01' )
这假设您在每个表中都有一个关于 dev_name
的索引。
【讨论】:
【参考方案3】:如果你想确定数据表的来源,你可以创建一个新的字段,比如“origin”:
SELECT *
FROM (SELECT 'switches' as origin, * FROM switches
UNION ALL
SELECT 'routers' as origin, * FROM routers) t
WHERE dev_name = 'coreswitch01'
【讨论】:
以上是关于如何查询多个表以获取表具有相同列名的记录的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地查询多个表以在 dataGrid 中生成 excel STYLE 报告