我有两张桌子。自我加入并忽略一张桌子/一面的空值只有
一个表定义客户连接:
CREATE TABLE IF NOT EXISTS `cust_connections` (
`id` int(11) NOT NULL,
`short_name` char(15) COLLATE utf8_unicode_ci NOT NULL,
`source_fnn` char(10) COLLATE utf8_unicode_ci NOT NULL,
`dest_fnn` char(10) COLLATE utf8_unicode_ci NOT NULL,
`service_type` char(32) COLLATE utf8_unicode_ci NOT NULL,
`ladder_side` char(10) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `cust_connections` (`id`, `short_name`, `source_fnn`, `dest_fnn`, `service_type`, `ladder_side`) VALUES
(1, 'cust1', 'N2843453A', '', 'HD_300_Connect', 'src only'),
(2, 'cust2', '', 'N2843600A', 'HD_300_Connect', 'dest only'),
(3, 'cust3', 'N2720257O', 'N2731164O', 'DVB25_188byte', 'both'),
(4, 'cust4', 'N27xxx7O', 'N2731164O', 'DVB25_188byte', 'src ukn'),
(5, 'cust4', 'N27xxx7O', '', 'DVB25_188byte', 'ukn +blk');
ALTER TABLE `cust_connections`
ADD PRIMARY KEY (`id`);
ALTER TABLE `cust_connections`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=18;
其他表定义了设备:
CREATE TABLE IF NOT EXISTS `cust_port` (
`id` smallint(11) NOT NULL,
`system_name` char(32) COLLATE utf8_unicode_ci NOT NULL,
`slot_no` char(2) COLLATE utf8_unicode_ci NOT NULL,
`port_no` char(2) COLLATE utf8_unicode_ci NOT NULL,
`port_fnn` char(9) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `cust_port` (`id`, `system_name`, `slot_no`, `port_no`, `port_fnn`) VALUES
(1, '01-06C2:source', '7', '1', 'N2843453A'),
(2, '01-27B4:dest', '1', '2', 'N2843600A'),
(3, '01-27B6:source+dst', '17', '3', 'N2720257O'),
(4, '01-27B6:dst+src', '17', '3', 'N2731164O'),
(5, '01-32C6:dup_fnn1', '1', '2', 'N2845070O'),
(26, '01-32C6:dup_fnn2', '1', '3', 'N2845070O'),
(27, '01-32D6:no_fnn', '1', '4', ''),
(28, '01-32D6:diff_fnn', '1', '4', 'x123456');
ALTER TABLE `cust_port`
ADD PRIMARY KEY (`id`);
ALTER TABLE `cust_port`
MODIFY `id` smallint(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=29;
SQL结果是:
cc_id short_name source_fnn dest_fnn service_type ladder_side src_system_name src_slot_no src_port_no src_port_fnn dst_system_name dst_slot_no dst_port_no dst_port_fnn
1 cust1 N2843453A HD_300_Connect src only 01-06C2:source 7 1 N2843453A 01-32D6:no_fnn 1 4
2 cust2 N2843600A HD_300_Connect dest only 01-32D6:no_fnn 1 4 01-27B4:dest 1 2 N2843600A
3 cust3 N2720257O N2731164O DVB25_188byte both 01-27B6:source+dst 17 3 N2720257O 01-27B6:dst+src 17 3 N2731164O
4 cust4 N27xxx7O N2731164O DVB25_188byte src ukn NULL NULL NULL NULL 01-27B6:dst+src 17 3 N2731164O
5 cust4 N27xxx7O DVB25_188byte ukn +blk NULL NULL NULL NULL 01-32D6:no_fnn 1 4
我做的两个联接表。
问题是,如果port_fnn为null,我想排除该行,但如果客户源或目标fnns中的任何一个为null,则显示该行。
我正在做一个左(自我)加入,以匹配源fnns和目标fnns对设备fnn。不幸的是,我的客户fnns必须能够具有空值。
如果设备表中没有空值,我的查询很好用。 我的查询是:
SELECT
cc.id AS cc_id, short_name,source_fnn, dest_fnn, service_type,ladder_side,
src.system_name AS src_system_name,
src.slot_no AS src_slot_no,
src.port_no AS src_port_no,
src.port_fnn AS src_port_fnn,
dst.system_name AS dst_system_name,
dst.slot_no AS dst_slot_no,
dst.port_no AS dst_port_no,
dst.port_fnn AS dst_port_fnn
FROM cust_connections cc
LEFT JOIN cust_port src on cc.source_fnn=src.port_fnn
LEFT JOIN cust_port dst on cc.dest_fnn=dst.port_fnn
在我的结果集: 行1 - 具有源FNN只。我想要的结果是空的目标字段,即:
cc_id short_name source_fnn dest_fnn service_type ladder_side src_system_name src_slot_no src_port_no src_port_fnn dst_system_name dst_slot_no dst_port_no dst_port_fnn
1 cust1 N2843453A HD_300_Connect src only 01-06C2:source 7 1 N2843453A NULL NULL NULL NULL
查询被检测空FNN与不具有相关联的模糊神经网络的设备填充。 I.e .: 01-32D6:no_fnn。对于source_system_name发生
同样的问题在第2行和dst_system_name上行5.
不要ü希望从设备表中排除port_fnn? – WisdmLabs 2015-01-21 06:14:37
这个例子会是你期望的结果吗?你还可以保持查询和数据之间的表名相同吗?它有点混乱 – 2015-01-21 06:43:54
@Nigel,我只是看着你想要的结果。它与您查询的结果相同,除了一件事情,您在最后一行中表示您不希望获得任何数据的行中的数据。又名'equip4 4/2'这是从你说你希望它不被显示的行,因为它有一个空port_fnn – 2015-01-21 08:47:24