2017-08-06 19 views
0

このシンプルですが、私は本当に立ち往生しています。ここで私は同じ構造を持っており、この場合のデータまたはレコード一致する行のみを返すSQL Server

TableAの

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

TableBの二つの表から必要な結果セットの例がある

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 
+0

テーブルAとテーブルBは、3列を有している2行を有します。結果に2行しか含まれないのはなぜですか? –

+0

必ずしも2行である必要はありません。テーブルAの3行目にNULL値を持つ3行にすることができます – Muroiwa263

答えて

2

使用:

SELECT * 
FROM table1 t1 
JOIN Table2 t2 
ON t1.Ref =t2.Ref AND t1.cola = t2.cola 
    AND t1.colb = t2.colb AND t1.id = t2.id 

又は

SELECT * 
FROM table1 t1 
JOIN Table2 t2 
USING (Ref , cola , colb, id) 
1

もう一つの方法は

;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 
+0

少なくとも連結された列の間にセパレータを追加して、コリジョンを避ける必要があります。 – lad2025

+0

@ lad2025:私はこれが衝突を起こさないと思っています。sha1が衝突を起こすためには、何年もの時間がかかりました。 "6,610年のプロセッサ時間" https://www.theregister.co.uk/2017/02/23/google_first_sha1_collision/ – TheGameiswar

+0

「11 2」と「1 12」のようなコンカットは同じものを生成します。 '11 | 2' <>' 1 | 12' – lad2025

0

が推測されるであろう:

;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 
+0

両方のテーブルからすべての行を取得するために、INNER JOINではなくFULL OUTER JOINを使用します。 –

関連する問題