仅在SQL Server中返回匹配行

仅在SQL Server中返回匹配行,sql,sql-server,Sql,Sql Server,我相信这很简单,但我真的被卡住了。下面是我想要的两个表的结果集示例,这两个表具有相同的结构,在本例中是数据或记录 表 Ref cola colb id ------------------ 1 a b 14 1 a b 24 表B Ref cola colb id ------------------ 1 a b 1 1 a b 2 1 a b 3 预期结果: Ref

我相信这很简单,但我真的被卡住了。下面是我想要的两个表的结果集示例,这两个表具有相同的结构,在本例中是数据或记录

 Ref  cola  colb id
 ------------------
 1     a      b   14
 1     a      b   24
表B

Ref  cola  colb id
------------------
 1     a      b  1
 1     a      b  2
 1     a      b  3
预期结果:

Ref  cola  colb id Ref1  cola1 colb1 id1
----------------------------------------
1      a     b   14  1      a      b   1
1      a     b   24  1      a      b   2
使用:

使用:

还有一种方法是

;with cte
as
(
select Ref, cola,  colb, id,
hashbytes('sha1',concat(Ref, cola,  colb)) as tb1hash
from table1
)
 select 
 t1.Ref, --all required cols
 from cte c
join
(
select Ref, cola,  colb, id,
hashbytes('sha1',concat(Ref, cola,  colb)) as tb2hash
from table2
) b
on
b.tb2hash=c.tb1hash
还有一种方法是

;with cte
as
(
select Ref, cola,  colb, id,
hashbytes('sha1',concat(Ref, cola,  colb)) as tb1hash
from table1
)
 select 
 t1.Ref, --all required cols
 from cte c
join
(
select Ref, cola,  colb, id,
hashbytes('sha1',concat(Ref, cola,  colb)) as tb2hash
from table2
) b
on
b.tb2hash=c.tb1hash
猜测:

;WITH TableAWithRowNum
AS (
SELECT *, ROW_NUMBER(ORDER BY id) AS RowNum
FROM dbo.TableA
), TableBWithRowNum
AS (
SELECT *, ROW_NUMBER(ORDER BY id) AS RowNum
FROM dbo.TableB
)
SELECT a.*, b.*
FROM TableAWithRowNum a 
INNER JOIN TableBWithRowNum b ON a.Ref = b.Ref 
--AND other join predicates on ColA, ... etc.
AND a.RowNum = b.RowNum
猜测:

;WITH TableAWithRowNum
AS (
SELECT *, ROW_NUMBER(ORDER BY id) AS RowNum
FROM dbo.TableA
), TableBWithRowNum
AS (
SELECT *, ROW_NUMBER(ORDER BY id) AS RowNum
FROM dbo.TableB
)
SELECT a.*, b.*
FROM TableAWithRowNum a 
INNER JOIN TableBWithRowNum b ON a.Ref = b.Ref 
--AND other join predicates on ColA, ... etc.
AND a.RowNum = b.RowNum

您至少应该在连接的列之间添加分隔符以避免冲突。@LAD22025:我认为,这不会产生冲突,对于sha1来说,产生冲突需要很多年。“6610年的处理器时间”我是说concat like
11 2
1 12
将产生相同的冲突。在
11 | 2
1 | 12
中,您至少应该在连接的列之间添加分隔符以避免合并。@LAD22025:我认为,这不会产生冲突,sha1产生冲突需要很多年的时间。“6610年的处理器时间”我是指类似concat的
11 2
1 12
将产生相同的结果。其中
11 | 2
1 | 12
表格A有2行,而表格B有3行。为什么结果只包括2行?它不必是2行,它可以是3行,表A中的第3行有空值Stablea有2行,而表B有3行。为什么结果只包含2行?它不必是2行,它可以是3行,表A中的第3行具有空值。为了从两个表中获取所有行,而不是内部联接,我将使用完全外部联接。为了从两个表中获取所有行,而不是内部联接,我将使用完全外部联接。