好吧,所以我刚刚开始使用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。
因此,我猜有两个问题,一个是将两个查询组合在一起,然后进行比较。预先感谢。
答案 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