繁体   English   中英

简短但SQL查询(T-SQL,SQL Server)

[英]Short but though SQL Query (T-SQL,SQL Server)

假设我有2个表,每个表都有N列。 table1中没有重复的行

现在我们想知道table1中还包含了table2哪些数据集(包括重复项)。

我试过了

select * from table1
intersect
select * from table2

但这只给了我两个表中的唯一行。 但是我不想唯一的行,想要看到table2中table1所有行...

记住!! 我不能做

select *
from table1 a, table b
where a.table1col = b.table2col

...因为我在运行时不知道表的列数。

当然,我可以使用动态SQL进行某些操作,并遍历列号,但是我之所以问这个恰恰是因为对于这种东西来说,查询似乎太简单了。

例:

create table table1 (table1col int)
create table table2 (table2col int)

insert into table1 values (8)
insert into table1 values (7)

insert into table2 values (1)
insert into table2 values (8)
insert into table2 values (7)
insert into table2 values (7)
insert into table2 values (2)
insert into table2 values (9)

我想要我的查询然后返回:

8
7
7

如果不知道列数,则必须求助于在行上计算出的值以进行匹配。

CHECKSUM就是这样一种功能。

返回在表的一行或表达式列表上计算的校验和值。 CHECKSUM旨在用于构建哈希索引。

SQL语句

SELECT  tm.*
FROM    (
          SELECT  CS = CHECKSUM(*)
          FROM    Table2
        ) tm          
        INNER JOIN (          
          SELECT  CS = CHECKSUM(*)
          FROM    Table2          
          INTERSECT
          SELECT  CHECKSUM(*)          
          FROM    Table1
        ) ti ON ti.CS = tm.CS

请注意, CHECKSUM可能会引入冲突。 在对数据进行任何操作之前,您必须先进行测试。

编辑

如果您使用的是SQL Server 2005 ,则可以通过抛出HASH_BYTES使其更加健壮。

HASH_BYTES的缺点是,您需要指定要在其上进行操作的列,但是对于您之前已经知道的所有列,可以使用它来防止冲突。

除了相交- 链接

EXCEPT从左查询中返回在右查询中也找不到的任何不同的值。

INTERSECT返回由INTERSECT操作数的左侧和右侧的查询返回的任何不同的值。

也许EXCEPT可以解决您的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM