5

SQLServer2008を使用しています。次のような2つのテーブル変数があります。

FirstName
==========
Little
John  
Baby  

LastName
==========
Timmy
Doe  
Jessica

そして、結果テーブルは次のようになります。

 First      Last   
=====================
 Little     Timmy    
 John       Doe      
 Baby       Jessica

2つのテーブルを結合できるPKがないことに注意してください。カーソルを使おうとしていますが、起動方法がわかりません。

- - 更新しました - - -

まれなケースですが、レガシーデータをクリーンアップするためのスクリプトを作成しています。「Little」が「Timmy」と一致することを私たちが知る唯一の方法は、それらが両方ともテーブルの最初のレコードであるということです。テーブルにPKがありますが、関係がない場合は役に立ちますか?

ID FirstName
==========
1  Little
2  John  
3  Baby  
----------

ID LastName
==========
4  Timmy
5  Doe  
6  Jessica
----------

私はTSQLに精通していないので、メモリ内の配列をループするように2つのテーブルをループできると思いました。

4

5 に答える 5

7

行番号に基づいて一致させるために、次のようなものを試すことができます。

SELECT FirstName AS First, LastName AS Last
FROM
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, FirstName
  FROM FirstName
) t1
INNER JOIN
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, LastName
  FROM LastName
) t2
ON t1.RowNum = t2.RowNum

ただし、これをキーが不要であることを示すものと見なさないでください。

于 2012-05-22T17:07:27.160 に答える
2

IDがないと、これら2つのテーブル変数を確実に結合することはできません。そもそもそれらが通常の方法で入力されていると仮定すると、各テーブルは次のようにIDを使用して作成できます。

DECLARE @first TABLE(ID INT IDENTITY(1,1), NameFirst VARCHAR(30));
DECLARE @last TABLE(ID INT IDENTITY(1,1), NameLast VARCHAR(30));

-- Note that we don't need to list column names here
INSERT INTO @first VALUES('Little');
INSERT INTO @first VALUES('John');
INSERT INTO @first VALUES('Baby');

INSERT INTO @last VALUES('Timmy');
INSERT INTO @last VALUES('Doe');
INSERT INTO @last VALUES('Jessica');

SELECT n1.NameFirst
, n2.NameLast
FROM @first n1
INNER JOIN @last n2 ON n1.ID=n2.ID;

結果:

NameFirst                      NameLast
------------------------------ ------------------------------
Little                         Timmy
John                           Doe
Baby                           Jessica
于 2012-05-22T17:23:36.063 に答える
1

「ファーストレコード」というものはありません。読み取り順序は完全に定義されていません。これは実際にも当てはまります!実際には、ランダムな行の順序表示されます。

並べ替え順序を定義する必要があります。その後、次のようにクエリを実行できます。

SELECT FirstName AS First, LastName AS Last
FROM
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS r, FirstName
  FROM FirstName
) t1
INNER JOIN
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS r, LastName
  FROM LastName
) t2
ON t1.r = t2.r

プレースホルダー""に注意してくださいSORT ORDER HERE。それを記入する必要があります。例:「ID」または「FirstName」。

編集:あなたの編集を見て、IDにソート順を追加しました。これで動作します。

于 2012-05-22T17:19:08.313 に答える
0

これがあなたの場合にうまくいくかもしれないハックです:

select t1.id, t1.name, t2.name
from (select name, row_number() over (partition by null order by (select NULL)) as id
      from t1
     ) t1 join
     (select name, row_number() over (partition by null order by (select NULL)) as id
      from t2
     ) t2
     on t1.id = t2.id

私の経験では、orderのサブクエリを含むrow_number()は、実際には並べ替えが行われないことを意味しますが、行は順番に取り込まれます。これは、シングルスレッドインスタンスを使用している場合に機能する可能性が高くなります。

そして、私はそれが機能することを保証しません!間違いなく結果をチェックしてください!これが機能しない場合は、一時テーブルを使用して同じ効果を得ることができる場合があります。

このデータはデータベースの世界の外から来ていますか?このプロセスを複数回実行する必要がある場合は、外部またはデータベースへの入力時に問題を処理する必要があります。

于 2012-05-22T17:23:20.553 に答える
0

提示されたソリューション@JohnDeweyに基づいて、レコードをテーブル変数に並べ替えることができます。実際には、レコードの順序に基づいて値の間に関係が作成されます。

DECLARE @first TABLE(sequence INT IDENTITY(1,1), FirstName VARCHAR(30));
DECLARE @last TABLE(sequence INT IDENTITY(1,1), LastName VARCHAR(30));

INSERT INTO @first(FirstName)
SELECT FirstName FROM TableFisrt ORDER BY id;
-- sequence FirstName
-- ======== =========
--        1  Little
--        2  John  
--        3  Baby 

INSERT INTO @last(LastName)
SELECT FirstName FROM TableLast ORDER BY id;
-- sequence LastName
-- ======== =========
--        1  Timmy
--        2  Doe
--        3  Jessica 

SELECT frs.FirstName, lst.LastName
FROM @first frs
INNER JOIN @last lst ON frs.sequence = lst.sequence;
-- sequence FirstName
-- ======== =========
-- Little   Timmy
-- John     Doe
-- Baby     Jessica 
于 2012-05-22T18:18:06.127 に答える