在 SQL 部分 2 中合并相似的表

Posted

技术标签:

【中文标题】在 SQL 部分 2 中合并相似的表【英文标题】:Merging similar tables in SQL part 2 【发布时间】:2011-04-18 11:50:12 【问题描述】:

我认为上次人们不愿意帮助我,因为我不想发布专栏,但我很想解决这个问题,所以我将放弃我更好的判断并暴露它。

好的,我有两个相似的表,我使用 mysqlphp 来生成表。到目前为止,我有 3 张桌子:

CPE:
fastethernet00,subnet00,fastethernet01,subnet01,hsrp,vip,bgp,bgp_neighbor,remote_as,bgp_customer_net,next_hop,loopback,cpe,hostname,cpe_cust_index,int_next_hop_1,int_next_hop_2,voice,solution

Liverpool:
apn1,apn2,apn3,apn4,apn5,customer,vpi_vci,vlan1,cust_index,RADIUS,nexthop,atinterface1,atinterface2,feinterface1,feinterface2,spinterface1,spinterface2,ip_address_range1,ip_address_range2,handset_address_range1,handset_address_range2,handset_address_range3,handset_address_range4,handset_address_range5,handset_address_range6,handset_address_range7,handset_address_range8,handset_address_range9,handset_address_range10,handset_address_range11,handset_address_range12,handset_address_range13,handset_address_range14,handset_address_range15,handset_address_range16,DNS_Server1,DNS_Server2,OLVDM***,live

Greenwich:
apn_1,apn_2,apn_3,apn_4,apn_5,customer_,vpi_vci_,vlan_1,cust_index_,RADIUS_,nexthop_,atinterface_1,atinterface_2,feinterface_1,feinterface_2,spinterface_1,spinterface_2,ip_address_range_1,ip_address_range_2,handset_address_range_1,handset_address_range_2,handset_address_range_3,handset_address_range_4,handset_address_range_5,handset_address_range_6,handset_address_range_7,handset_address_range_8,handset_address_range_9,handset_address_range_10,handset_address_range_11,handset_address_range_12,handset_address_range_13,handset_address_range_14,handset_address_range_15,handset_address_range_16,DNS_Server_1,DNS_Server_2,OLVDM***_,live_

我需要完成的第一步是通过 apn_1/apn1 将格林威治和利物浦连接起来。相同的记录不一定在两者上,甚至可能存在重复。我用来创建这个表的 php 在 UNION ALL 周围抛出了一个语法错误:

mysql_query ("CREATE TABLE Both (
SELECT * FROM `Greenwich` left outer join Liverpool on Greenwich.apn_1 = Liverpool.apn1
UNION ALL
SELECT * FROM Greenwich
RIGHT OUTER JOIN Liverpool on Greenwich.apn_1 = Liverpool.apn1  where Greenwich.apn_1 is null)")

谁能看出这有什么问题?

之后,我需要通过 cust_index/cust_index_ 将结果表链接到 cpe_cust_index,所以理想情况下我认为我需要合并这些单元格。如果这些细胞存在于格林威治和利物浦,它们将永远是相同的。

提前致谢!

【问题讨论】:

@Soop:为什么在第二个子查询中包含“Greenwich.apn_1 为空”? 它应该包括来自格林威治和利物浦的所有条目——所有来自利物浦和格林威治的匹配,然后是利物浦所有不在格林威治的条目 城镇/城市的个人表格 - 嗯,这不是一个好的开始。 不是城镇,是两个独立的服务器。 @Soop:如果 Greenwich.apn_1 永远不会为空,那么我认为您肯定会遇到 UNION 错误... 【参考方案1】:

答案是这里描述的第三种方式,使用“互斥(互斥)表

http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/

加上一个过滤器,这正是我所需要的。现在我只需要将索引字段和 apn 1 字段合并在一起。

【讨论】:

【参考方案2】:

尝试命名您要选择的所有列和别名,然后使用AS 以便它们匹配。 Union 不喜欢列名不匹配。

例如。

Select col1 as col1, col2 as col2 from table1
Union
Select col-1 as col1, col-2 as col2 from table2

【讨论】:

我看不出会有什么不匹配,阿德里安。 @Soop 正在从同一张表中选择 * (ALL):格林威治!

以上是关于在 SQL 部分 2 中合并相似的表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:合并语句的更新部分不起作用

邮件合并法

MySQL 效率 - 2 个单独的表或连接

SQL实用技巧:如何将表中某一列的部分数据合并到一行中

在SQL炼金术查询中合并相似的行

mysql中,2个不同数据,同一结构的表,如何合并数据