用联盟加入不同的记录

时间:2018-01-04 22:56:46

标签: sql sql-server join

我有一个问题,尽管我尝试了一切,但我无法解决这个问题。 我正在创建一个具有多个连接的表,并将从两个不同数据库中提取的表联合起来两个数据库之间的一些记录重叠,我有以下问题: 表1

+------+--------+-------+------+
| Col1 |  Col2  | Col3  | Algo |
+------+--------+-------+------+
|    1 | jOB1   | Test1 | NULL |
|    1 |  JOB2  | Test2 | NULL |
|    1 |  JOB3  | Test3 | Null |
+------+--------+-------+------+

表2:

+------+--------+-------+-------+
| Col1 |  Col2  | Col3  | Algo  |
+------+--------+-------+-------+
|    1 | jOB1   | Test1 | NULL  |
|    1 |  JOB2  | Test2 | NULL  |
|    1 |  JOB3  | Test3 | ARFTU |
+------+--------+-------+-------+

UNION

+------+-------+-------+-------+
| Col1 | Col2  | Col3  | Algo  |
+------+-------+-------+-------+
|    1 | jOB1  | Test1 | NULL  |
|    1 | JOB2  | Test2 | NULL  |
|    1 | JOB3  | Test3 | NULL  |
|    1 | JOB3  | Test3 | ARFTU |
+------+-------+-------+-------+

如何消除最终表中具有NULL值的行?如果另一个 行存在相同的Col1,Col2,Col3列?

提前感谢!!!

编辑我的最终结果以使其更清晰: 我想在最后得到的表是表2,即如果'Algo'值不存在则保持行为null。如果'Algo'值确实存在,则删除NULL记录并仅保留填充的记录:

+------+--------+-------+-------+
| Col1 |  Col2  | Col3  | Algo  |
+------+--------+-------+-------+
|    1 | jOB1   | Test1 | NULL  |
|    1 |  JOB2  | Test2 | NULL  |
|    1 |  JOB3  | Test3 | ARFTU |
+------+--------+-------+-------+

3 个答案:

答案 0 :(得分:1)

为什么不直接使用聚合?

select col1, col2, col3, max(algo) as algo
from ((select col1, col2, col3, algo from t1) union all
      (select col1, col2, col3, algo from t2)
     ) tt
group by col1, col2, col3;

答案 1 :(得分:1)

试试

select * from (
  select * from t1 where algo is not null
  union
  select * from t2 where algo is not null)
t

我首先尝试消除每个选择表。好吧,如果你有相同的col1,2,3值,算法有两个值,它将被取出。 如果algo具有相同的值,那么将合并,否则如果algo具有不同的值,则它将被同时获取。

答案 2 :(得分:0)

计算应删除的内容(下表之间)然后 从结果中删除它们:

CBPeripheralStateDisconnecting