[英]JOIN across two tables
我需要从postgresql数据库中提取一些数据,并从两个表中的每一个中获取一些元素。 这些表包含与物理网络设备有关的数据,其中一个表专门用于这些设备的mac地址。 每个设备均按位置(车辆)和功能(dev_name)标识。
表1(资产):
vehicle
dev_name
dev_serial
dev_model
table2:(macs)
vehicle
dev_name
mac
interface
我试过的
SELECT assets.vehicle, assets.dev_name, dev_model, dev_serial, mac
FROM assets, macs
AND interface = 'E0'
ORDER BY vehicle, dev_name
;
但这似乎不符合我想的那样匹配vehicle和dev_name。 相反,它似乎打印了mac和dev_serial的每种组合,这不是预期的输出,因为我要为每一行输出一行。
如何根据assets.dev_name = macs.dev_name和assets.vehicle = macs.vehicle确保它与设备的mac地址匹配?
注意: assets
某些设备可能没有在mac
记录的mac地址,在这种情况下,我希望无论如何它们都显示为空的mac
使用join
您可以指定必须匹配的列
SELECT a.vehicle, a.dev_name, dev_model, dev_serial, mac
FROM assets a
LEFT JOIN macs m ON m.vehicle = a.vehicle
AND m.dev_name = a.dev_name
WHERE interface = 'E0'
ORDER BY a.vehicle, a.dev_name
了解有关SQL连接的信息 。
select
a.vehicle, a.dev_name, a.dev_model, a.dev_serial, m.mac
from assets as a
inner join macs as m on m.dev_name = a.dev_name and m.vehicle = a.dev_name
where m.interface = 'E0'
order by a.vehicle, a.dev_name
在您的情况下,它是内部联接,但是如果要获取所有资产并为接口E0的那些显示mac,则可以使用左外部联接 :
select
a.vehicle, a.dev_name, a.dev_model, a.dev_serial, m.mac
from assets as a
left outer join macs as m on
m.dev_name = a.dev_name and m.vehicle = a.dev_name and m.interface = 'E0'
order by a.vehicle, a.dev_name
一个简单的join关键字就是您解决问题的方法
SELECT assets.vehicle, assets.dev_name, dev_model, dev_serial, mac
FROM assets A join macs M
ON A.dev_name = M.dev_name
否则继续您的方法,只需按如下所示修改查询:
SELECT assets.vehicle, assets.dev_name, dev_model, dev_serial, mac
FROM assets, macs
WHERE interface = 'E0' AND assets.dev_name = macs.dev_name
ORDER BY vehicle, dev_name;
请记住,对于任何联接而言,条件都非常重要,否则,它将变成另一个交叉联接,即每行与每隔一行的组合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.