1

我想比较本地数据库中的 3 个表。

我的问题是我需要知道哪些表具有相同的数据,哪些表缺少数据。

例子:

Table A:
IpAddress    |HostName
10.10.01.10  | something
255.255.255.1| something else

Table B:
IpAddress    |HostName
10.10.01.10  |something

Table C:
IpAddress    |HostName
255.255.255.1| something else
1.1.1.1      | blabla

我需要一张表格来显示这样的数据

IpAddress\HostName\TableA\TableB\TableC
10.10.01.10\something\1\1\0
255.255.255.1\something else\1\0\1
1.1.1.1\blabla\0\0\1
4

2 回答 2

5

您可以使用 UNION ALL 在子查询中从三个表中获取数据,然后使用带有 CASE 表达式的聚合函数来计算 ipaddress 和 hostname 在每个表中出现的次数:

select ipaddress, HostName,
    SUM(case when tbl = 'a' then 1 else 0 end) tablea, 
    SUM(case when tbl = 'b' then 1 else 0 end) tableb,
    SUM(case when tbl = 'c' then 1 else 0 end) tablec
from
(
    select ipaddress, HostName, 'a' tbl
    from tablea
    union all
    select ipaddress, HostName, 'b' tbl
    from tableb
    union all
    select ipaddress, HostName, 'c' tbl
    from tablec
) d
group by ipaddress, HostName;

请参阅带有演示的 SQL Fiddle

于 2013-05-22T19:34:44.893 回答
0

这是完成您所要求的一种方法

SELECT ipaddress||'\'||
       hostname||'\'||
       SUM(tabA)||'\'||
       SUM(tabB)||'\'||
       SUM(tabC)
  FROM (SELECT ipaddress, 
               hostname, 
               1 tabA, 
               0 tabB, 
               0 tabC 
          FROM tableA
        UNION ALL
        SELECT ipaddress, 
               hostname, 
               0 tabA, 
               1 tabB, 
               0 tabC 
          FROM tableB
        UNION ALL
        SELECT ipaddress, 
               hostname, 
               0 tabA, 
               0 tabB, 
               1 tabC 
          FROM tableC
       )
 GROUP BY ipaddress,
          hostname

我不知道您使用的是什么数据库,但是这个数据库可以与 Oracle 一起使用,而且我确信只要稍作修改,它就可以与其他数据库一起使用。

于 2013-05-22T19:40:05.467 回答