基于公共字段比较两种不同查询的结果

时间:2018-07-27 16:29:42

标签: sql-server

好吧,所以我刚刚开始使用SQL,所以如果有我不知道的超级简单解决方案,请对我方便。我正在使用Microsoft SQL Server。我有两个查询可以给我结果,一个是

EXEC ('SELECT  ID ,        
  Type,        
  Date                
  FROM DB2T.BBT') AT DB2

另一个是

select 
    ca.value('(/CA[@name=''ID'']/@value)[1]','VARCHAR(MAX)') as ID,
    ca.value('(/CA[@name=''Type'']/@value)[1]', 'VARCHAR(MAX)') as Type,
    ca.value('(/CA[@name=''Date'']/@value)[1]', 'VARCHAR(MAX)') as Date,
from log

这就是我从需要的地方提取相关数据的方式。我以两个不同的表输出结束两个不同的查询,每行包含一个ID,Type和Date。

我需要结合这两个查询,以便可以比较两个表。根据两个查询中的匹配ID,我需要查看Type和Date的值是否相等。我只想输出具有不同值的ID,然后输出具有不同值的ID。

因此,我猜有两个问题,一个是将两个查询组合在一起,然后进行比较。预先感谢。

3 个答案:

答案 0 :(得分:1)

此查询将结果集组合为一个,然后按ID,Type和Date列分组,然后拉回没有两行的列(应该从DB2中获得一行,而从SQL中获得一行)。它并不能告诉您到底有什么不同,但是用那几列就可以很容易地告诉您。

SELECT
    MIN(System) AS System,
    ID,
    Type,
    Date
FROM (
    select 
        'SQL',
        ca.value('(/CA[@name=''ID'']/@value)[1]','VARCHAR(MAX)') as ID,
        ca.value('(/CA[@name=''Type'']/@value)[1]', 'VARCHAR(MAX)') as Type,
        ca.value('(/CA[@name=''Date'']/@value)[1]', 'VARCHAR(MAX)') as Date,
    from log

    UNION ALL

    SELECT 'DB2', * FROM OPENQUERY([DB2], ''SELECT  ID, Type, Date FROM DB2T.BBT'')
) compare
GROUP BY ID, Type, Date
HAVING COUNT(*) <> 2
ORDER BY ID, Type, Date

答案 1 :(得分:0)

基本上,将其细分为2个查询。第一个是qry1,第二个是qry2。您要使用内部联接,因为您只需要Type和Date相等的值。然后,使用WHERE子句仅为您提供ID不匹配的记录。

您可能必须将ID放在方括号中,无论是否保留字,我都不记得了。我知道Date和Type都是保留字,这就是为什么我将它们放在方括号中。

SELECT
  qry1.ID as ID1,
  qry1.[Type] as Type1,
  qry1.[Date] as Date1,
  qry2.ID as ID2,
  qry2.[Type] as Type2,
  qry2.[Date] as Date2
FROM
  (SELECT ID, Type, Date                
  FROM DB2T.BBT) as qry1,
INNER JOIN
  (select 
    ca.value('(/CA[@name=''ID'']/@value)[1]','VARCHAR(MAX)') as ID,
    ca.value('(/CA[@name=''Type'']/@value)[1]', 'VARCHAR(MAX)') as Type,
    ca.value('(/CA[@name=''Date'']/@value)[1]', 'VARCHAR(MAX)') as Date,
    from log) as qry2
  ON qry1.[Type] = qry2.[Type]
  AND qry1.[Date] = qry2.[Date]
WHERE qry1.ID <> qry2.ID

答案 2 :(得分:0)

如何比较作为连接列值哈希值的计算列?像这样:

declare @t1 table (id int, type varchar(max), dt date, hash_bytes as HASHBYTES('SHA1', CAST(id AS NVARCHAR(MAX)) + CAST(type AS NVARCHAR(MAX)) + CAST(dt AS NVARCHAR(MAX))))
declare @t2 table (id int, type varchar(max), dt date, hash_bytes as HASHBYTES('SHA1', CAST(id AS NVARCHAR(MAX)) + CAST(type AS NVARCHAR(MAX)) + CAST(dt AS NVARCHAR(MAX))))

insert into @t1 values 
(1, 'val1', getdate()),        -- no match in @t2 
(2, 'val2', getdate() + 1),
(3, 'val3', getdate() + 2),
(4, 'val4', getdate() + 3),
(5, 'val5', getdate() + 4)

insert into @t2 values 
(2, 'val2', getdate() + 1),    -- same
(3, 'val300', getdate() + 2),  -- different type
(4, 'val4', getdate() + 300),  -- different date
(5, 'val500', getdate() + 400),-- different type & date
(6, 'val6', getdate() + 5)     -- no match in @t1

select * 
from @t1 t1
full join @t2 t2 on t1.hash_bytes = t2.hash_bytes

id      type    dt          hash_bytes                                  id      type    dt          hash_bytes
1       val1    2018-07-27  0xF53D672F572DC49D15AE2ECD2F3225624073FEB8  NULL    NULL    NULL        NULL
2       val2    2018-07-28  0x8840035CC198447CB1F9D85E97A57F2B08ADB39E  2       val2    2018-07-28  0x8840035CC198447CB1F9D85E97A57F2B08ADB39E
3       val3    2018-07-29  0x372E6A3B48C3C96C2456A514CD9D35CAC4EEEACE  NULL    NULL    NULL        NULL
4       val4    2018-07-30  0xE91A2E58D2964BB3BE6BDD1C1ECA3628E956484D  NULL    NULL    NULL        NULL
5       val5    2018-07-31  0xB289831856A15334BE60EC4F78502052B15EE4CD  NULL    NULL    NULL        NULL
NULL    NULL    NULL        NULL                                        3       val300  2018-07-29  0x2007D7205352EE65013DC21E527780E1FED763D8
NULL    NULL    NULL        NULL                                        4       val4    2019-05-23  0x60CC2C7B3902204E82F137401446EB974EC83C3B
NULL    NULL    NULL        NULL                                        5       val500  2019-08-31  0xFFF8FD045B306B3F1663FC4903CE859A6C9577FB
NULL    NULL    NULL        NULL                                        6       val6    2018-08-01  0x72407548472D00C87E6DDF42A05E0B1B687AACBA