我需要将以下两个有效 查询转换为一个查询,但所有内容 由于各种原因,我尝试在我身上死去。我的最终结果是尝试列出所有 手头上的软件,并显示为所查询的特定 PC 安装了哪些软件,哪些未安装。对于已安装的软件,列出名称,否则为名称显示 NULL。我已经在 where 子句中尝试了一些子选择语句,这些语句给了我一个没有错误的结果,但不是正确的结果。感谢您的帮助。
qry1
SELECT device_software.sw_id
FROM Software_device LEFT JOIN Device ON Software_device.d_id = Device.d_id
WHERE Device.d_id = 1;
qry2
SELECT Software.name, Software.sw_id, qry1.sw_id
FROM software LEFT JOIN qry1 ON software.sw_id = qry1.sw_id;
设备表
------------------
| name | d_id |
------------------
| PC1 | 1 |
| PC2 | 2 |
| PC3 | 3 |
------------------
软件表
------------------
| name | sw_id |
------------------
| SW_a | A |
| SW_b | B |
| SW_c | C |
| SW_d | D |
------------------
Software_Device 表(多对多)
------------------
| d_id | sw_id |
------------------
| 1 | A |
| 1 | B |
| 2 | A |
| 2 | B |
| 2 | C |
------------------
结果我正在寻找... (在 PC1 上安装和卸载软件)
---------------------------------
| Sotfware | pc_id | name |
---------------------------------
| SW_a | 1 | PC1 |
| SW_b | 1 | PC1 |
| SW_c | NULL | NULL |
| SW_d | NULL | NULL |
---------------------------------
我列出了 mysql 和 sql 标签,因为我认为这不重要,但以防万一,我使用的是 mysql。
最佳答案
如果 RomanKonz 的答案肯定很接近,只需将“where”移动到“on”,让左连接适本地工作。
select software.name as Software,
device.d_id as pc_id,
device.name as name
from software
left join device_software
on device_software.sw_id = software.sw_id
and **device_software**.d_id = 1
left join device
on device_software.d_id = device.d_id
;
关于mysql - 使用 WHERE 选择 LEFT/RIGHT JOIN 并返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549266/