SQL-запрос для вставки в столбцы со значением из строк - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть следующая таблица в результате запроса скажем calc_success_rate

server,      service,     timestamp,     success_rate
123.23.23.2  ftp          1:00 am        1
123.23.23.2  http         1:00 am        0.5

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

server       ftpSuccessRate     httpsuccessrate       timestamp  
123.23.23.2  1                  0.5                   1:00

Я сделаю соединение между calc_success_rate.server и metrics.server и calc_success_rate.timestamp и metrics.timestamp и вставлю ftpsuccessrate и httpsuccessrate

Возможно ли сделать это одним запросом

Мне нужно заявление об обновлении что-то вроде этого

update secondTable st 
set ftpSuccessRate = , httpSuccessRate = 
from firstTable ft 
where ft.server = st.server and ft.timestamp = st.timestamp

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011
INSERT INTO SecondTable
    (server, ftpSuccessRate, httpSuccessRate, timestamp)
    SELECT server, 
           MAX(CASE WHEN service = 'ftp' THEN success_rate ELSE NULL END),
           MAX(CASE WHEN service = 'http' THEN success_rate ELSE NULL END), 
           timestamp
         FROM FirstTable
         GROUP BY server, timestamp;  

РЕДАКТИРОВАТЬ : На основе комментария, вот версия ОБНОВЛЕНИЯ:

UPDATE st 
    SET ftpSuccessRate = q.ftpSuccessRate,
        httpSuccessRate = q.httpSuccessRate
    FROM (SELECT server,  
                 MAX(CASE WHEN service = 'ftp' THEN success_rate ELSE NULL END) as ftpSuccessRate, 
                 MAX(CASE WHEN service = 'http' THEN success_rate ELSE NULL END) as httpSuccessRate,  
                 timestamp 
              FROM FirstTable 
              GROUP BY server, timestamp) q 
        INNER JOIN @SecondTable st 
            ON q.server = st.server 
                AND q.timestamp = st.timestamp 
1 голос
/ 13 декабря 2011
INSERT INTO
  youTable
SELECT
  server,
  MAX(CASE WHEN service = 'ftp'  THEN success_rate END)   AS  ftpSuccessRate,
  MAX(CASE WHEN service = 'http' THEN success_rate END)   AS httpSuccessRate,
  timestamp
FROM
  yourOtherTable
GROUP BY
  server,
  timestamp

Или как обновление существующих записей ...

UPDATE
  yourOtherTable
SET
  ftpSuccessRate  = COALESCE(MAX(CASE WHEN service = 'ftp'  THEN success_rate END), yourOtherTable.ftpSuccessRate ),
  httpSuccessRate = COALESCE(MAX(CASE WHEN service = 'http' THEN success_rate END), yourOtherTable.httpSuccessRate)
FROM
  yourOtherTable
LEFT JOIN
  yourtable
    ON  yourTable.server    = yourOtherTable.server
    AND yourTable.timestamp = yourOtherTable.timestamp
GROUP BY
  yourOtherTable.server
  yourOtherTable.timestamp
0 голосов
/ 13 декабря 2011
 UPDATE 
  metrics SET 
      ftpSuccessRate = (CASE WHEN service = 'ftp' THEN success_rate ELSE NULL END),
      httpsuccessrate = (CASE WHEN service = 'http' THEN success_rate ELSE NULL END)    
  FROM 
    calc_success_rate 
  WHERE 
    metrics.server = calc_success_rate.Server
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...