Объединение таблиц SQL и автозаполнение новых записей

0

У меня есть две таблицы, которые мне нужно объединить вместе. Слияние будет принимать таблицу дат, добавить ее в таблицу с другой информацией и при этом создать новые записи. Есть ли способ автоматически заполнять новые записи информацией из первой записи. Пример:

Таблица 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.

Теги:
merge

3 ответа

0

Пожалуйста, используйте это. Это отлично работает в mysql Server и MS SQL SERVER

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

Если я понимаю, что вы имеете в виду, это выполнит эту работу:

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;

Результаты:

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

Если вы хотите заполнить столбцы Tag и Location, используйте:

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
    Из приведенного выше объяснения кажется, что он не хочет значения NULL в тегах и расположении, но хочет, чтобы они были автоматически заполнены 1 и 5 соответственно.
  • 0
    @ KindaTechy Я хочу, чтобы таблица 1 выглядела как ожидаемые результаты. Обновите ответ;)
0

Вы можете использовать кросс-соединение:

SELECT * FROM table1 CROSS JOIN table2

Это объединит каждую строку каждой таблицы в каждую строку в другой таблице. В ограниченном примере, который вы опубликовали, вы получите все разные даты, и тег/местоположение будет повторяться. Если есть два тега/местоположения, вы получите 8 строк, каждая дата появится дважды, и каждая пара тегов/местоположений появится 4 раза и т.д.

Другой пример:

TableA TableB
A      1
B      2
C      3

A cross join B

A1 A2 A3 B1 B2 B3 C1 C2 C3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню