ОБЪЕДИНЕНИЕ нескольких таблиц на основе метки времени и другого условия

#sql #postgresql #join #timestamp

#sql #postgresql #Присоединиться #метка времени

Вопрос:

Я хочу объединить 3 таблицы, в таблице A есть дата и время в разных полях, которые необходимо сначала объединить, чтобы их можно было сравнить в таблице B, используя метку времени поля.

Таблица A

  userid |  date_in   | check_in
-------- ------------ ----------
 145    | 2017-01-23 | 08:56:05
 254    | 2017-01-24 | 08:56:54
 202    | 2017-01-25 | 08:53:26
 15     | 2017-01-26 | 08:47:40
  

Таблица B

  userid |      checktime      |      sn
-------- --------------------- ---------------
 145    | 2017-01-23 08:56:05 | 0345135200184
 254    | 2017-01-24 08:56:54 | 0345135200184
 202    | 2017-01-25 08:53:26 | 0345135200184
 15     | 2017-01-26 08:47:40 | 0345135200184
  

Таблица 3

       sn       |    alias
--------------- -------------
 0345135200184 | Alam Sutera
  

Я попробовал это:

 select process.userid, process.date_in, process.check_in, checkinout.checktime, iclock.alias from process 
inner join checkinout on checkinout.checktime=(select cast (date_in as timestamp(0))   (check_in - time '00:00:00') checktime from process)
inner join iclock on checkinout.sn=iclock.sn
order by userid desc limit 10;
  

Я также пробовал это:

 select checkinout.userid, checkinout.checktime, checkinout.sn from checkinout
inner join lateral
(select distinct userid, date_in, check_in from process where 
date_in=(select checktime::date from checkinout) and 
check_in=(select checktime::time from checkinout)
order by date_in asc limit 1)
process ON true;
  

Оба они выдают ошибку:
ОШИБКА: более одной строки, возвращаемой подзапросом, используемым в качестве выражения

Ожидаемый результат:

  userid |  date_in   | check_in |      checktime     | alias
-------- ------------ ---------- -------------------- -------
 145    | 2017-01-23 | 08:56:05 | 2017-01-21 09:49:04|Alam Sutera
 254    | 2017-01-24 | 08:56:54 | 2017-01-21 07:57:05|Alam Sutera
 202    | 2017-01-25 | 08:53:26 | 2017-01-21 14:27:00|Alam Sutera
 15     | 2017-01-26 | 08:47:40 | 2017-01-21 06:30:34|Alam Sutera
  

Может кто-нибудь помочь мне решить эту проблему?
Спасибо за помощь.

Комментарии:

1. как все checktime даты будут 2017-01-21 в вашем ожидаемом выводе. Пожалуйста, объясните.

2. Ой, прошу прощения. Я ошибаюсь, чтобы отредактировать ожидаемый результат. Я имею в виду, что это должно быть то же самое с date_in . спасибо, что заметили это.

3.Ой, прошу прощения. Я ошибаюсь, чтобы отредактировать ожидаемый результат. Я имею в виду, что это должно быть то же самое с date_in . спасибо, что заметили это.

Ответ №1:

Добавив date time поле и, вы получите временную метку, которую можно сравнить для объединения. таким образом, вы можете написать свой запрос, как показано ниже:

 select 
t1.userid, t1.date_in, t1.check_in, t2.checktime, t3.alias
from process t1
inner join checkinout t2 on t2. checktime= date_in   check_in and t1.userid=t2.userid
inner join table3 t3 on t2.sn=t3.sn
  

ДЕМОНСТРАЦИЯ

Что касается вашей ошибки, о которой вы упомянули в своем вопросе ERROR: more than one row returned by a subquery used as an expression , связано с условием соединения, которое вы использовали.

Комментарии:

1. Спасибо, сэр. Это действительно решено. Дата время может быть такой меткой времени … Я не знаю об этом.

2. t2.checktime= date_in check_in и t1.userid=t2.userid Вы знаете, как я могу использовать его в code igniter для этого кода? Я уже пробовал это: $this-> db-> join (‘checkinout t2’, ‘(t2.checktime = date_in check_in) и (t1.userid = t2.userid)’); но по-прежнему не получается ожидаемый результат, как в запросе выше.

Ответ №2:

Вы можете преобразовать отдельные столбцы даты и времени в метку времени, используя функцию To_Timestamp, как показано ниже. Это должно позволить вам присоединять таблицы A и TableB по желанию.

 select * from tableA a 
join tableB b 
on a.userid = b.userid 
and to_timestamp(a.date_in || ' ' || a.check_in, 'YYYY-MM-DD HH24:MI:SS') = b.checktime
  

Как показано здесь