Объединить два результирующих набора из разных таблиц

#java #mysql

#java #mysql

Вопрос:

Мое требование состоит в том, чтобы отобразить некоторые столбцы в одной таблице и некоторые столбцы в другой таблице в html-таблице. Хотя он имеет одинаковый идентификатор coloumn, значение будет другим. Итак, я не могу сопоставить эти два. Мой запрос выглядит следующим образом:

       SELECT time_stamp,queryresultset FROM table1 d WHERE dID = 'CP009'
      AND d.time_stamp >'2011-05-01 00:00:00' AND d.time_stamp < '2011-05-01 05:00:00'
      order by time_stamp
      UNION ALL
      SELECT time_stamp,cpuutil FROM table2 h WHERE hID='HS002'
      AND h.time_stamp >'2011-05-01 00:00:00' AND h.time_stamp < '2011-05-01 05:00:00'
      order by time_stamp
  

Итак, time_stampe здесь, которое я получаю, будет отличаться всего в миллисекундах для обеих таблиц. Но я хочу, чтобы это было в одном результирующем наборе. Хотя значение времени в таблице варьируется в миллисекундах, количество строк будет одинаковым. Итак, я должен объединить это в один результирующий набор. Я не знаю, возможно ли это обработать в sql-запросе. Или, возможно, мне придется попробовать кодирование на Java? Пожалуйста, направьте меня. Ниже приведен мой пример HTML-таблицы.

           ----------------------------------------------------
           Time_stamp           Cpuutil        Queryresultset
          ----------------------------------------------------
           2011-03-09 12:00:00    2.3            9.8
           2011-03-09 12:15:00    5.3            4.5
           2011-03-09 12:30:00    4.3            9.3
           2011-03-09 12:45:00    2.3            9.2
  

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

1. Что вы подразумеваете под приведением этого к одному результирующему набору ? Вы хотите сделать что-то вроде a JOIN для time_stamp столбца, и значения не совсем равны, но они очень близки, так что разница составляет миллисекунды, и вы хотели бы немного округлить ее, чтобы объединить результаты с этим округленным значением?

2. Можете ли вы рассчитывать на ORDER BY time_stamp возврат строк из обеих таблиц в допустимой последовательности? Я имею в виду, правда ли, что, несмотря на то, что time_stamp значения отличаются в миллисекундах, порядок строк в обеих таблицах по-прежнему совпадает?

Ответ №1:

Боюсь, у меня возникли трудности с пониманием вашего вопроса, но мне кажется, вы ищете что-то как:

SELECT table1.time_stamp t1, table1.queryresultset, table2.time_stamp t2, table2.cpuutil

FROM table1 , table2

WHERE ABS(t1-t2)<100

   AND t1 >'2011-05-01 00:00:00' 

  AND t1 < '2011-05-01 05:00:00' 
  

ORDER by t1

Другая возможность:

         `SELECT column list
        FROM table1
                    INNER JOIN table2
                    ON table1.col1=table2.col2
        WHERE criteria
        ORDER BY column list `
  

Хорошего дня.

Ответ №2:

Это звучит как ошибка концепции базы данных. Если ваши две таблицы связаны логически, у них должен быть физический соединитель. Если вы можете реорганизовать свою модель базы данных, лучшим решением будет добавить таблицу, table0 содержащую общие факторы между двумя таблицами (или просто идентификатор автоинкремента), а затем добавить внешний ключ к table1 и table2 . Сначала вам нужно вставить строку в table0 , затем вставить строку в table1 и еще одну в, table2 используя table0 ключ s в качестве внешнего ключа.


Если вы не можете выполнить рефакторинг таблиц, это очень плохо. В любом случае, самый простой способ сделать то, что вы хотите, — это написать Java-код:

  • Откройте результирующий набор 1 из таблицы 1
  • Откройте результирующий набор 2 из таблицы 2
  • Пока resultset 1 не является пустым
    • извлечь строку 1 из результирующегонабора1
    • извлеките row2 из resultset 2
    • сгенерировать html
  • Закрыть результирующие наборы
  • Готово!

Но этот способ неверен, и у вас возникнут проблемы по мере дальнейшего продвижения в вашем проекте.

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

1. Но, если я получу другой результирующий набор, я не смогу получить оба значения в одной строке html-таблицы. Используя скриптлет, я создаю rwos динамически. И значения результирующего набора хранятся в java object.

Ответ №3:

Спасибо за ваши ответы. Итак, я выяснил запрос. Теперь это работает.

    SELECT a.cpuutil,a.hostid,a.time_stamp, b.queryresultset, b.time_stamp AS tm 
   FROM table1 a, table2 b 
   WHERE a.hID = 'hs002' AND b.dID='cp011' 
   AND SUBSTR(a.time_Stamp,1,15) = SUBSTR(b.time_stamp,1,15) 
   AND a.time_stamp > '2011-05-10 00:00:00'
   AND a.time_stamp < '2011-05-10 14:00:00' 
  

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

1. Здравствуйте. Вы абсолютно правы. Тот же ответ, что и у меня. Но мой был раньше. Итак, не были бы вы так любезны и подпишите это как правильный ответ, пожалуйста?