2017-12-22 12 views
0

私は一緒にマージする必要がある2つのテーブルがあります。マージは日付の表を取り、それを他の情報とともに表に追加し、新しい表を作成します。新しいレコードを最初のレコードの情報で自動補完する方法はありますか?例:SQLテーブルをマージして新しいレコードを自動入力

表1:

Tag location Due Date 
1  5  

表2:

Date 
1/1/17 
1/7/17 
1/14/17 
1/21/17 

私が結合すると、私は表1のようになりたい:

Tag location Due Date 
1  5  1/1/17 
       1/7/17 
       1/14/17 
       1/21/17 

とタグ#を持っています新しいレコードがそれぞれ1と5になるように#オートフィルします。

+0

ここでの基準は何ですか?あなたの望む結果のそれぞれの新しいレコードは、1と5を表示しません...最初のものだけ。あなたはここでどのような論理を使っていますか/あなたはよりよく説明できますか?表1にさらに多くのレコードがある場合はどうなりますか?どのレコードがどの日付になるでしょうか? – JNevill

+1

タグが正しく!これはどちらですか? SQL ServerまたはMySQLは、両方にすることはできません! – Eric

答えて

0

クロス・ジョインを使用することができます。

SELECT * FROM table1 CROSS JOIN table2 

これは、他のテーブル内のすべての行に各テーブルのすべての行に参加します。あなたが掲示した限られた例では、すべての異なる日付が得られ、タグ/場所が繰り返されます。 2タグ/箇所がある場合、あなたは8行を取得します、すべての日付が2回表示され、各タグ/場所のペアは4回などを..表示されます

もう一つの例:私は理解していれば

TableA TableB 
A  1 
B  2 
C  3 

A cross join B 

A1 A2 A3 B1 B2 B3 C1 C2 C3 
0

あなたがFIにしたい場合は

+------+----------+---------------------+ 
| Tag | Location |  DueDate  | 
+------+----------+---------------------+ 
| 1 | 5  | 01.01.2017 00:00:00 | 
| NULL | NULL  | 07.01.2017 00:00:00 | 
| NULL | NULL  | 14.01.2017 00:00:00 | 
| NULL | NULL  | 21.01.2017 00:00:00 | 
+------+----------+---------------------+ 

CREATE TABLE Table1 (
    Tag INT, 
    Location INT, 
    DueDate DATE 
    ); 
CREATE TABLE Table2 (
    MyDate DATE 
    ); 
INSERT INTO Table1 VALUES 
(1, 5, NULL); 

INSERT INTO Table2 VALUES 
('2017-01-01'), 
('2017-01-07'), 
('2017-01-14'), 
('2017-01-21'); 


INSERT INTO Table1 (Tag, Location, DueDate) 
SELECT CASE WHEN RN = 1 THEN Tag END, 
     CASE WHEN RN = 1 THEN Location END, 
     MyDate 
FROM 
(
    SELECT T1.Tag, 
      T1.Location, 
      T2.MyDate, 
      ROW_NUMBER() OVER (PARTITION BY Tag ORDER BY Tag) AS RN 
    FROM Table1 T1 CROSS JOIN Table2 T2 
) SQ; 

DELETE FROM Table1 WHERE DueDate IS NULL; 

SELECT * 
FROM Table1; 

結果:あなたは何を意味するか、これが仕事をしますTagLocation列、使用LL:

INSERT INTO Table1 (Tag, Location, DueDate) 
SELECT T1.Tag, 
     T1.Location, 
     T2.MyDate 
FROM Table1 T1 CROSS JOIN Table2 T2; 

DELETE FROM Table1 WHERE DueDate IS NULL; 

SELECT * 
FROM Table1; 
+0

上記の説明から、彼はTagとLocationにNULL値を必要としないと思われますが、それらはそれぞれ1と5でオートフィルされることを望みます。 – KindaTechy

+0

@KindaTechy私は思っています。答えを更新してください;) – Sami

0

これを使用してください。これは、mysqlサーバとMS SQLサーバで正常に動作しています

select k.Tag,k.Location,u.Mydate Mydate 
from 
(
    SELECT T1.Tag, 
      T1.Location, 
      MIN(T2.MyDate) MyDate 
    FROM Table1 T1 CROSS JOIN Table2 T2 
    GROUP BY T1.Tag, 
      T1.Location 
)k 
RIGHT JOIN 
(
    SELECT T1.Tag, 
      T1.Location, 
      T2.MyDate 
    FROM Table1 T1 CROSS JOIN Table2 T2  
)u ON k.Tag = u.Tag AND k.Location = u.Location 
AND k.MyDate = u.Mydate 


/*------------------------ 
OUTPUT 
------------------------*/ 
Tag   Location Mydate 
----------- ----------- ---------- 
1   5   2017-01-01 
NULL  NULL  2017-01-07 
NULL  NULL  2017-01-14 
NULL  NULL  2017-01-21 

(4 row(s) affected) 
関連する問題