SQL Соединение двух таблиц с двумя общими столбцами - проблема времени и даты - PullRequest
1 голос
/ 14 апреля 2020

У меня есть две таблицы в SQL, к которым я пытаюсь присоединиться.

Table1:

Date                             |        Name       |        Shoe_Size     |     Pay_method
2020-04-04 05:27:00.0000000      |    J.Bloggs       |         8            |      Credit
2020-04-04 05:55:00.0000000      |    J.Smith        |         10           |      Cash
2018-06-20 05:27:00.0000000      |    J.Bloggs       |         6            |      Cash
2018-08-15 05:55:00.0000000      |    J.Smith        |         9            |      Cash

Table2:

Date_ID                             |        Name       |        TShirt_Size 
2020-04-04 00:00:00.0000000         |    J.Bloggs       |         M
2020-04-04 00:00:00.0000000         |    J.Smith        |         L
2018-06-20 00:00:00.0000000         |    J.Bloggs       |         S
2018-08-15 00:00:00.0000000         |    J.Smith        |         M

Я хотел бы объединить таблицы, чтобы показать:

 Date                            |        Name       |       Shoe_Size    |  TShirt_Size
2020-04-04 05:27:00.0000000      |    J.Bloggs       |         8          |       M
2020-04-04 05:55:00.0000000      |    J.Smith        |         10         |       L
2018-06-20 05:27:00.0000000      |    J.Bloggs       |         6          |       S
2018-08-15 05:55:00.0000000      |    J.Smith        |         9          |       M

Код, который я пробовал :

SELECT a.Date, a.Name, a.Shoe_Size, b.DATE_ID, b.Name, b.Tshirt_Size
From Table1 a, Table2.b
WHERE a.Name = b.Name

Но, очевидно, не учитывает измерение даты.

Вещи, которые я не знаю, как получить:

  1. Как для объединения на основе двух общих столбцов (имя и дата).

  2. Дата в таблице 1 имеет точное время, а дата в таблице 2 просто имеет правильный день. Будет только одна запись на имя в день.

Любая помощь будет высоко ценится.

Ответы [ 3 ]

4 голосов
/ 14 апреля 2020

Попробуйте - используйте правильные ANSI СОЕДИНЕНИЯ и сравните только по дате (без временной части):

SELECT 
    a.Date, a.Name, a.Shoe_Size, b.Name, b.Tshirt_Size
FROM 
    Table1 a
INNER JOIN 
    Table2 b ON a.Name = b.Name
             AND CAST(a.Date AS DATE) = CAST(b.Date_ID AS DATE)
3 голосов
/ 14 апреля 2020

Попробуйте это:

SELECT a.Date, a.Name, a.Shoe_Size, b.DATE_ID, b.Name, b.Tshirt_Size
From Table1 a
INNER JOIN Table2.b
    ON a.Name = b.Nam
    AND CONVERT(VARCHAR(10),a.Date, 121) = CONVERT(VARCHAR(10), b.date, 121)
1 голос
/ 14 апреля 2020

Я хотел бы сделать:

select
    t1.date,
    t1.name,
    t1.shoe_size,
    t2.tshirt_size
from table1 t1
inner join table2 t2 
    on  t1.name = t2.Name
    and t1.date >= t2.date
    and t1.date <  dateadd(day, 1, t2.date)

Преимущество этого подхода в том, что функция даты не применяется к датам, приходящимся на table1 - я ожидаю, что она имеет лучшую производительность, чем другие решения, использующие функции даты в этом столбце.

...