从一个表中选择Mysql中另一个表中不存在的数据

从一个表中选择Mysql中另一个表中不存在的数据,mysql,join,Mysql,Join,我有两张桌子,表一和表二 表2包含表中的记录,其中一些列较少。每次调用该过程时,它都会检查列的组合(复合键,尽管未声明)是否存在 如果存在,则更新其中一列,否则生成新条目 desc MAIN_TBL; +---------------+-------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default

我有两张桌子,表一和表二

表2包含表中的记录,其中一些列较少。每次调用该过程时,它都会检查列的组合(复合键,尽管未声明)是否存在

如果存在,则更新其中一列,否则生成新条目

desc MAIN_TBL;
+---------------+-------------+------+-----+---------------------+----------------+
| Field         | Type        | Null | Key | Default             | Extra          |
+---------------+-------------+------+-----+---------------------+----------------+
| id            | int(11)     | NO   | PRI | NULL                | auto_increment |
| LinkID        | int(11)     | YES  | MUL | NULL                |                |
| Protocol      | varchar(10) | YES  |     | NULL                |                |
| SourceIP      | varchar(30) | YES  |     | NULL                |                |
| DestinationIP | varchar(30) | YES  |     | NULL                |                |
| SourcePort    | int(11)     | YES  |     | NULL                |                |
| DestPort      | int(11)     | YES  |     | NULL                |                |
| NoOfBytes     | int(11)     | YES  |     | NULL                |                |
| insertTime    | timestamp   | NO   |     | CURRENT_TIMESTAMP   |                |
| StartTime     | timestamp   | NO   |     | 0000-00-00 00:00:00 |                |
| EndTime       | timestamp   | NO   |     | 0000-00-00 00:00:00 |                |
| Direction     | varchar(10) | YES  |     | NULL                |                |
| Trafficbps    | int(11)     | YES  |     | NULL                |                |
| nFlows        | int(11)     | YES  |     | NULL                |                |
| flag          | tinyint(1)  | YES  |     | 0                   |                |
+---------------+-------------+------+-----+---------------------+----------------+
数据

select Protocol,SourceIP,DestinationIP,SourcePort,DestPort,NoOfBytes from MAIN_TBL;
+----------+----------+---------------+------------+----------+-----------+
| Protocol | SourceIP | DestinationIP | SourcePort | DestPort | NoOfBytes |
+----------+----------+---------------+------------+----------+-----------+
| TCP      | 1.1.1.1  | 2.2.2.2       |       1080 |      443 |     10000 |
| TCP      | 1.1.1.1  | 2.2.2.2       |       1080 |     8080 |     20000 |
| TCP      | 1.1.1.1  | 2.2.2.2       |       1090 |     8080 |     20000 |
+----------+----------+---------------+------------+----------+-----------+
表2:

desc SRCIP_TOP_TALKERS5;
+---------------+-------------+------+-----+-------------------+-------+
| Field         | Type        | Null | Key | Default           | Extra |
+---------------+-------------+------+-----+-------------------+-------+
| SourceIP      | varchar(30) | YES  |     | NULL              |       |
| DestinationIP | varchar(30) | YES  |     | NULL              |       |
| DestPort      | int(11)     | YES  |     | NULL              |       |
| SourcePort    | int(11)     | YES  |     | NULL              |       |
| Protocol      | varchar(10) | YES  |     | NULL              |       |
| NoOfBytes     | int(11)     | YES  |     | NULL              |       |
| Time_1        | timestamp   | NO   |     | CURRENT_TIMESTAMP |       |
+---------------+-------------+------+-----+-------------------+-------+
数据

select Protocol,SourceIP,DestinationIP,SourcePort,DestPort,NoOfBytes from SRCIP_TOP_TALKERS5;
+----------+----------+---------------+------------+----------+-----------+
| Protocol | SourceIP | DestinationIP | SourcePort | DestPort | NoOfBytes |
+----------+----------+---------------+------------+----------+-----------+
| TCP      | 1.1.1.1  | 2.2.2.2       |       1080 |      443 |     10000 |
+----------+----------+---------------+------------+----------+-----------+
现在,我的过程首先更新那些组合(SourcePort、DestPort、SourceIP、DestinationIP、Protocol)出现在SRCIP\u TOP\u TALKERS5中的条目

查询是:

update SRCIP_TOP_TALKERS5 T1 INNER JOIN MAIN_TBL T2
                        on
                        T1.SourceIP = T2.SourceIP and
                        T1.DestinationIP = T2.DestinationIP and
                        T1.DestPort = T2.DestPort and
                        T1.SourcePort = T2.SourcePort and
                        T1.Protocol = T2.Protocol
                        set T1.NoOfBytes=T1.NoOfBytes+T2.NoOfBytes;
之后,我希望插入未找到匹配项的其余行。
如果您考虑我现有的数据(如上文所示),则应该从MiNETTBL输出2行,其中5个元组的组合不存在于SrcIPpTopiTalks5<5/强>

< p>您可以做右连接。< /P>
UPDATE SRCIP_TOP_TALKERS5 T1
RIGHT JOIN MAIN_TBL T2 ON T1.SourceIP = T2.SourceIP
AND T1.DestinationIP = T2.DestinationIP
AND T1.DestPort = T2.DestPort
AND T1.SourcePort = T2.SourcePort
AND T1.Protocol = T2.Protocol
set T1.NoOfBytes= COALESCE(T1.NoOfBytes,0) + T2.NoOfBytes;

如果T1不是T2的子集,请合并T2。如果这对您有效,请告诉我

我通过参考SO上的其他链接找到了答案

我需要做一个左连接并进行空检查(这里重要的是从select中的两个表中提取所有列)


伙计们,如果需要一些信息,请告诉我..嗨,Raghav,mysql不支持完全外部连接。。我尝试将“完全外部联接”替换为“联接”来进行查询,其行为类似于我上面给出的查询。(它更新现有记录的noobbytes)。我的实际查询是查找SRCIP_TOP_TALKERS5表中不存在的记录。
select T1.NoOfBytes as NoOfBytes,T1.Protocol as Protocol,T1.SourcePort as SourcePort,T1.SourceIP as SourceIP,
                    T1.DestinationIP as DestinationIP,T1.DestPort as DestPort,
                    T2.Protocol as Proto,T2.SourcePort as srcPrt,T2.SourceIP as SrcIP,T2.DestinationIP as DestIP,T2.DestPort as DstPrt
                    from MAIN_TBL T1 left join SRCIP_TOP_TALKERS5 T2
                    on T1.SourceIP = T2.SourceIP and
                            T1.DestinationIP = T2.DestinationIP and
                            T1.DestPort = T2.DestPort and
                            T1.SourcePort = T2.SourcePort and
                            T1.Protocol = T2.Protocol
                    where T2.SourcePort is null