2017-02-21 2 views
-1

У меня есть база данных оракула, и я пытаюсь запросить данные в таблице1 и внутреннем соединении с другой таблицей2, где один из столбцов (дата) равен самой последней дате и другой столбец в таблице 2 (построен) равен «да». Этот запрос ниже не подбирая функции, где и не может точно определить, почемуВнутреннее соединение SQL-запроса и где на второй таблице

SELECT id, b, c, d 
FROM table1 a 
INNER JOIN table2 b on b.id = a.id 
WHERE b.date =(SELECT MAX(date) FROM table2) AND b.built = 'yes' 

Фактический запрос

SELECT m_tp_str, m_tp_trn, m_tp_dte, m_tp_buy, m_tp_qtyeq, m_tp_nom, m_instr, 
     m_tp_p, m_tp_status2 
FROM HA_PRD_DM.TP_ALL_REP a INNER JOIN HA_PRD_DM.UDF_CURR_REP b 
      ON a.m_udf_ref2 = b.m_nb 
WHERE b.m_rep_date2 = (SELECT MAX(c.m_rep_date2) FROM HA_PRD_DM.UDF_CURR_REP c) 
    AND b.m_purpose = 'yes' 
+0

Что значит «не поднять функцию, где есть функция? Вы получили сообщение об ошибке? Вы получаете нулевые строки? Можете ли вы опубликовать некоторые ожидаемые результаты? Я ожидаю, что вы хотите получить строку с 'MAX (date)' _ для каждого id_, но это не то, что вы говорите в вопросе, и это не то, что ваш запрос будет делать. Некоторые разъяснения помогут. –

+0

@MatthewMcPeak У меня нет ошибок или нулевых строк. У меня ожидается 5k строк, но я получаю более 1,5 мм. И нет MAX (дата) для каждого идентификатора. Я хочу получить все ID (может быть дубликатов), который имеет максимальную дату – obabs

+0

Маловероятно, что это ** фактический ** запрос (вы выбираете 'b', который является псевдонимом для таблицы, поэтому, пожалуйста, не делайте ответ ** да это фактический запрос **). Отправьте фактический запрос, иначе вам будет сложно помочь. – mathguy

ответ

1

Вы можете сделать это, используя аналитические функции:

SELECT id, b, c, d 
FROM table1 a INNER JOIN 
    (SELECT b.*, MAX(date) OVER (PARTITION BY b.id) as max_date 
     FROM table2 b 
     WHERE built = 'yes' 
    ) b 
    ON b.id = a.id AND b.max_date = b.date; 
+0

Это предполагает, что OP хочет max по id, хотя это не то, что предлагает его попытка запроса. Другой член ** спросил ** (вместо простого размещения решения), и ОП ответил, что он действительно имел в виду ** глобальный ** max, а не аналитический макс. Этот подход «стрелять, а затем нацеливать» на «помогающих» людей не так полезен. – mathguy

Смежные вопросы