我有一个包含两个表,交换机和路由器的数据库。两个表中的列具有相同的名称(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的记录,并仅向我显示它在其中找到的任何表中的一条记录。
答案 0 :(得分:1)
您可以使用Public Sub refresh_cf2()
Dim dataConn As New ADODB.Connection
Dim strSQL As String
Dim strCON As String
Dim strCmd As New ADODB.Command
Dim loadTable As QueryTable
Dim qt As QueryTable
Dim rst As ADODB.recordSet
Dim connstring As String
Dim sqlstring As String
Sheet3.AutoFilterMode = False
For Each qt In Sheet3.QueryTables
qt.Delete
Next
Sheet3.Range("A1:NTM300000").Cells.Clear
sqlstring = "Select * from tableB "
connstring = _
"ODBC;DSN=PostgreSQL35W2;UID=user name;PWD=user password;Database=dbB;Port=5434"
With ActiveSheet.QueryTables.Add(Connection:=connstring, _
Destination:=Range("A1"), SQL:=sqlstring)
.Refresh
End With
End Sub
集运算符:
union all
答案 1 :(得分:0)
每当我看到两个具有相同(或几乎相同)列的表时,我会问:“为什么这两个表没有合并成一个表?”您可能需要额外的一列来说明它是哪种东西(路由器还是交换机),但这只是很小的开销。
但是,假设您有2张桌子...
对于您的特定查询,这是最佳选择:
( SELECT * FROM switches WHERE dev_name = 'coreswitch01' )
UNION ALL
( SELECT * FROM routers WHERE dev_name = 'coreswitch01' )
这假设您在每个表的dev_name
上都有一个索引。
答案 2 :(得分:0)
如果要确定数据表的原点,可以创建一个类似于“ origin”的新字段:
SELECT *
FROM (SELECT 'switches' as origin, * FROM switches
UNION ALL
SELECT 'routers' as origin, * FROM routers) t
WHERE dev_name = 'coreswitch01'