sql-запрос для объединения 3 таблиц с помощью joins

#sql #tsql

#sql #tsql

Вопрос:

Я хотел отобразить значения столбцов 3 таблиц (регистрация данных, температура, давление), как показано ниже, и мой запрос также показан ниже, но здесь значения температуры повторяются, я хочу все соответствующие значения для конкретной даты, как я могу это сделать? кто-нибудь может мне помочь, пожалуйста?

Таблицы являются

  1. регистрация данных 5

     name     shift name   operator   id   date                     plant   line   machi
    -------  -----------  ---------  ---  -----------------------  ------  -----  -----
    ashwini  shift1(7-3)  Operator1  102  2011-06-07 00:00:00.000  Plant1  Line1  mc1
    pradeep  shift1(7-3)  Operator1  101  2011-06-06 00:00:00.000  Plant1  Line1  mc1
    ...
      
  2. температура

     temprature  time                     date
    ----------  -----------------------  -------------------
    27          1900-01-01 15:45:41.000  2011-06-06 00:00:00
    27.3        1900-01-01 15:50:41.000  2011-06-06 00:00:00
    ...
      
  3. давление

     temprature  time                     date
    ----------  -----------------------  -------------------
    0.5         1900-01-01 15:45:41.000  2011-06-06 00:00:00
    0.7         1900-01-01 15:50:41.000  2011-06-06 00:00:00
    ...
      

мой sql-запрос

 select Date=convert(varchar(12),(t1.date),101), t1.time, operatorname, 
    machine, line, t2.time, Temprature, Pressure
from datalogging5 t 
inner join temprature t1 on t1.date=t.date 
inner join pressure t2 on t.date=t2.date  order by t.date
  

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

1. Схему базы данных из SQL было бы легче понять, чем все эти данные. Есть ли возможность сделать скриншот дизайна базы данных?

2. WraithNath прав. Нам нужны сценарии создания трех таблиц и инструкции INSERT для заполнения трех таблиц после их создания.

3. Я немного почистил материал, теперь его должно быть легче читать

4. Вам действительно не следует пытаться объединить ваши таблицы вместе, используя дату (и время?) поля (ы). Поле внешнего ключа в ваших таблицах temprature и pressure, ссылающееся на вашу таблицу регистрации данных, было бы лучшим способом

5. И если это не в рабочей среде, пожалуйста, пожалуйста, пожалуйста, исправьте написание temperature. Это сведет сопровождающих с ума.

Ответ №1:

Я не особенно свободно владею SQL, поэтому, если я делаю что-то не так, дайте мне знать, но не могли бы вы просто сделать что-то вроде:

 
SELECT CONVERT(varchar(12),(t1.date),101) AS Date, t1.time, t.operatorname, 
    t.machine, t.line, t2.time, t1.temprature, t2.pressure
FROM datalogging5 t 
INNER JOIN temprature t1 ON t1.date=t.date 
INNER JOIN pressure t2 ON t.date=t2.date
WHERE t.date = '2011-6-10'
ORDER BY t.date;
  

Вы могли бы заменить 2011-6-10 любым вашим поисковым запросом.
Что касается вашей проблемы с повторением температуры, я думаю, проблема в том, что вы пытаетесь соединить таблицы через столбцы даты. Существует вероятность того, что более чем одна запись данных или температуры имеет одну и ту же дату, и поэтому, когда вы запускаете свой запрос, он будет отображаться один раз для каждой записи, которой он соответствует, что делает ее похожей на дубликат.

В любом случае, дайте мне знать, соответствует ли этот код тому, что вы искали, или нет.

Ответ №2:

Вам необходимо объединить таблицы температуры и давления как по дате, так и по времени (поскольку они, по-видимому, хранятся в отдельных столбцах)

 Select D.Date, T.Time...
From DataLoggings As D
    Join Temperature As T
        On T.Date = D.Date
    Join Pressure As P
        On P.Date = T.Date
            And P.Time = T.Time
  

В вашей схеме и этом запросе есть некоторые ошибки:

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

Вы могли бы рассмотреть таблицу измерений вместо отдельной таблицы для температуры и давления. Итак, что-то вроде:

 Create Table Measurements
    (
    ReadingType varchar(15) not null
    , Reading float not null
    , Date date not null
    , Time time not null
    , Check( ReadingType In('Temperature','Pressure') )
    )