2

このSQL DEMOを作成しました:

私は #tbl1 を持っています:

___cola__
  1
  2
  3
  4

および #tbl2 :

_colb_
  a
  b
  c
  d

これ欲しい :

_colb____|__cola____
  a           1
  b           2
  c           3
  d           4

私は解決策を見つけました(悪い私見)

SELECT table1.cola, table2.colb FROM
(SELECT cola, ROW_NUMBER() OVER (ORDER BY cola) AS rn1 FROM #tbl1) table1,
(SELECT colb, ROW_NUMBER() OVER (ORDER BY colb) AS rn2 FROM #tbl2) table2
WHERE table1.rn1 = table2.rn2

知識については、どうすれそれを行うことができますか?

私はから始めました:

SELECT cola , s.f FROM #tbl1 cross apply(select colb as f from #tbl2) s

しかし、右のセクションに問題があります。

4

2 に答える 2

6

代替案は次のとおりです。

SELECT cola, colb
FROM (
  SELECT a.cola, b.colb,
         rna=row_number() over (partition by colb
                                order by cola),
         rnb=row_number() over (partition by cola
                                order by colb)
  FROM #tbl1 a
  CROSS JOIN #tbl2 b
  ) X
WHERE rna=rnb;

そして別:

;WITH
 a1 AS (SELECT cola, ROW_NUMBER() OVER (ORDER BY cola) AS rn1 FROM #tbl1),
 a2 AS (SELECT colb, ROW_NUMBER() OVER (ORDER BY colb) AS rn2 FROM #tbl2)
SELECT a1.cola, a2.colb
FROM a1
JOIN a2 on a1.rn1=a2.rn2;

しかし、正直なところ、2 つ目はクエリの一部を再配置しているだけです。実行計画は、あなたが持っていたものとまったく同じです。それは機能し、そのようなzip-upクエリの最も効率的な計画です。

于 2012-10-25T12:30:29.580 に答える
0
;with CTE1 as (select col1,row_number() over (order by (select 0)) as rn from #tbl1)
,with CTE2 as (select col1,row_number() over (order by (select 0)) as rn from #tbl2)

select c1.col1,c2.col1 from CTE1 c1 inner join CTE2 c2
on c1.rn=c2.rn
于 2012-10-25T12:37:25.923 に答える