2 带有 WHERE 子句的表连接
Posted
技术标签:
【中文标题】2 带有 WHERE 子句的表连接【英文标题】:2 Table Joins with WHERE clause 【发布时间】:2017-08-23 07:27:38 【问题描述】:我正在使用 mysql,但我很难从 SELECT 查询中获取结果。我有 2 张桌子。第一个表硬件,第二个表softwares_name_cache:
desc hardware;
+----------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| DEVICEID | varchar(255) | NO | PRI | NULL | |
| NAME | varchar(255) | YES | MUL | NULL | |
| WORKGROUP | varchar(255) | YES | MUL | NULL | |
| USERDOMAIN | varchar(255) | YES | | NULL | |
| OSNAME | varchar(255) | YES | MUL | NULL | |
| OSVERSION | varchar(255) | YES | | NULL | |
| OSCOMMENTS | varchar(255) | YES | | NULL | |
| PROCESSORT | varchar(255) | YES | | NULL | |
| PROCESSORS | int(11) | YES | | 0 | |
| PROCESSORN | smallint(6) | YES | | NULL | |
| MEMORY | int(11) | YES | MUL | NULL | |
| SWAP | int(11) | YES | | NULL | |
+----------------+---------------------+------+-----+---------+----------------+
desc softwares_name_cache;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| NAME | varchar(255) | YES | UNI | NULL | |
+-------+--------------+------+-----+---------+----------------+
我正在尝试获取每个 SQL 服务器的处理器数量 (sum(hardware.PROCESSORN)
,因此我需要加入来自表硬件的 (OSNAME LIKE '%Server%')
条件和来自表 softwares_name_cache 的 (softwares_name_cache where name like '%Microsoft SQL Server 20%')
条件。
【问题讨论】:
您的两个表都有一个名为名称的列。要么使用table_name.Name
(hardware.Name
或 softwares_name_cache.Name
,具体取决于您应用过滤器的那个),要么给表格一个别名并使用该别名。
【参考方案1】:
SELECT sum(hardware.PROCESSORN)
FROM hardware
inner join softwares_name_cache on hardware.ID= softwares_name_cache.ID
WHERE (OSNAME LIKE '%Server%')
AND softwares_name_cache.NAME IN
(
select softwares_name_cache.NAME
from softwares_name_cache
where softwares_name_cache.NAME like '%Microsoft SQL Server 20%'
);
【讨论】:
result sum(hardware.PROCESSORN) NULL 不正确 好吧,查询本身有问题,所以内连接可能不是获得sum(hardware.PROCESSORN)
..的理想解决方案。
是的,但错误已修复正确吗?查询背后的逻辑取决于您或提供一些额外信息,看看我是否可以帮助您
我正在尝试获取每个 SQL 服务器的处理器数量 (sum(hardware.PROCESSORN),因此我需要从表硬件中加入 (OSNAME LIKE '%Server%') 条件和 ( softwares_name_cache where name like '%Microsoft SQL Server 20%') 条件来自表 softwares_name_cache。
是的,但是这些表没有共同点,为什么要加入他们的 ID?只需加入他们,然后从加入的表中得到你想要的东西【参考方案2】:
由于“名称”字段对于硬件和软件名称缓存表都是通用的。在您的 where 条件中,您正在使用 Name 过滤。因此它会引发错误。试试这样:
SELECT sum(hardware.PROCESSORN)
FROM hardware
inner join softwares_name_cache on hardware.id = softwares_name_cache.ID
WHERE (OSNAME LIKE '%Server%') AND softwares_name_cache.NAME IN IN (select NAME from
softwares_name_cache where name like '%Microsoft SQL Server 20%');
【讨论】:
相同结果 sum(hardware.PROCESSORN) NULL 不正确以上是关于2 带有 WHERE 子句的表连接的主要内容,如果未能解决你的问题,请参考以下文章