4

次の 2 つのテーブルから抽出したデータから新しいテーブルを作成する必要があります。

最初のテーブル:

Var     cur_number
-------------------
 A        10
 B         8

2 番目のテーブル:

Var    new_number
-------------------
 A          2
 A         11
 B          4
 B          6

新しいテーブルには 'Var' 列と 'Number' 列が含まれている必要があります。ここで、変数ごとにその cur_number を含む 1 つの行があり、残りの行には 2 番目のテーブルの new_number 列の数値が含まれます。ここで、new_number < cur_number。たとえば、上記の例では、A の場合、10 (cur_number) の行が 1 つと、'2' の行が 1 つ存在します (2<10 であるため、ただし 11>10 であるため)。

私の例では、新しいテーブルは次のようになります。

Var         Number
 A            10
 A            2
 B            8
 B            4
 B            6

データベースは非常に大きく、実行時間が重要であるため、2 つのテーブルで UNION を使用できません...

4

4 に答える 4

2

このスクリプトは、table1 の「Var」値ごとに 1 つのレコードしかないと想定しています。

--table1 からすべて挿入

insert into newtable (var,number)
select var,cur_number from table1 t1

--new_number < cur_number の table2 から挿入

insert into newtable (var,number)
select t2.var, t2.new_number 
from table2 t2
inner join table1 t1 on t1.var = t2.var and t2.new_number < t1.cur_number
于 2012-11-29T13:05:43.377 に答える
1

これらの2つのテーブルに重複する値がないことがわかっている場合は、UNION ALL代わりにを使用できます。UNION

select * from table1 t1
UNION ALL
select* from table2 t2
where t2.new_number < t1.cur_number

重複する値とは、次のような意味です。

table1:

var           cur_number
A                8

table2:

var           new_number
A                8  

違いは、を使用して結果セットから重複を排除するため、UNION ALLよりも高速でUNIONあるということです。重複している場合は、私の経験では最高です。UNIONSELECT DISTINCTUNION

于 2012-11-29T12:45:42.230 に答える
1

これを試して:

SELECT var, cur_number
FROM FirstTable
UNION
SELECT t2.var, t2.new_number
FROM Firsttable t1
INNER JOIN SecondTable t2 ON t2.new_number < t1.cur_number;

更新: SQL Server 2008 以降を使用している場合は、次MERGEのように 2 つのテーブルを 1 つにマージするために使用できます。

MERGE INTO FirstTable AS TGT
USING SecondTable AS SRC
  ON  SRC.new_number >= TGT.cur_number
WHEN NOT MATCHED THEN
  INSERT (var, cur_number)
  VALUES (SRC.var, SRC.new_number);

SQL フィドルのデモ

これにより、2 つのテーブルの値が最初のテーブルにマージされます。最初のテーブルには以下が含まれます。

VAR    CUR_NUMBER
A          10
B          8
A          2
B          4
B          6

注意:使用時MERGE:

  • セミコロンでステートメントを終了する必要がMERGEあります。これは必須です。
  • INSERTで逆WHEN MATCHEDの条件を使用したのはその>=ためWHEN NOT MATCHEDです。
于 2012-11-29T12:38:17.803 に答える
0

なぜ使用しないのUnionですか?* SQLFIDDLE

select * from first
union 
select s.var,s.new_number from second s
join first f
on s.var = f.var
join (
select f.var, max(f.cur_number) maxn
from first f
group by f.var) as t
on t.var = s.var
where s.new_number < t.maxn
order by var asc
;

結果

VAR     CUR_NUMBER
A        10
B        8
A        2
B        4
B        6
于 2012-11-29T12:34:00.790 に答える