2016-10-04 2 views
0

Я ударился головой о стену для чего-то, что, по моему мнению, должно быть простым, но просто не получится работать.SQL-группировка. Как выбрать строку с наибольшим значением столбца при объединении. Нет, CTEs

Я пытаюсь получить строку с наибольшим значением multi_flag, когда я присоединяюсь таблицу А и таблицу В, но я не могу показаться, чтобы получить SQL правильно, потому что она возвращает все строки, а не в один с самое высокое значение multi_flag.

Вот мои таблицы ...

Таблица A

enter image description here

Таблица B

enter image description here

Это почти мой желаемый результат, но только, если я уйду из строки value_id

SELECT CATALOG, VENDOR_CODE, INVLINK, NAME_ID, MAX(multi_flag) AS multiflag 
FROM TBLINVENT_ATTRIBUTE AS A 
INNER JOIN TBLATTRIBUTE_VALUE AS B 
ON A.VALUE_ID = B.VALUE_ID 
GROUP BY CATALOG, VENDOR_CODE, INVLINK, NAME_ID 
ORDER BY CATALOG DESC 

enter image description here

Это близко к тому, что я хочу извлечь, но не совсем заметил, как она возвращает уникальный name_id и самый высокий multi_flag, но я также нужен value_id, который принадлежит к такому multi_flag/name_id группировки .. .

Если я включаю value_id в моем SQL заявление, то он возвращает все строки и больше не группируются

Notic Эйн ниже результатов как он больше не возвращает строку для самого высокого multi_flag и как все разные значения для name_id (пример. name_id 1) также возвращается

enter image description here

+0

, какую базу данных вы используете? ..удалил неиспользуемый флаг – scaisEdge

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

+0

Следить за троллями – rojobo

ответ

1

Вы можете использовать подзапрос, производную таблицу или КТР, чтобы решить эту проблему. Производительность будет зависеть от количества данных, которые вы запрашиваете. Чтобы достичь своей цели получения максимального мультифлага, вы должны сначала получить максимальное значение на основе группировки, которую вы хотите достичь, вы можете использовать CTE или дополнительный запрос. В приведенном ниже CTE будет указано максимальное значение multi_flag, которое вы можете использовать для получения max multi_flag, а затем вы можете использовать его для присоединения к другим таблицам. В этом примере у меня есть три объединения, но это может быть уменьшено, и, насколько это возможно, лучше использовать подзапрос, но вы хотите знать, пока не увидите планы фактического исполнения рядом.

; с highest_multi_flag как ( выберите value_id, макс (multi_flag) КАК multiflag ОТ TBLINVENT_ATTRIBUTE группе value_id ) выберите A.CATALOG, a.VENDOR_CODE, a.INVLINK, b.NAME_ID, m.multiflag from maximum_multi_flag m Внутреннее соединение TBLINVENT_ATTRIBUTE AS A на a.VALUE_ID = b. m.VALUE_ID INNER JOIN TBLATTRIBUTE_VALUE AS B ON m.VALUE_ID = B.VALUE

+0

Спасибо за ваш отзыв, я обязательно попробую это, хотя я не очень хорошо знаю CTE любые предложения? @tywan – rojobo

+0

@rojobo - CTE уже является частью решения Tywan; не так много «знать», что он описал. Он вызывается с предложением 'with'. В отсутствие аналитических/оконных функций, я думаю, что это самый лучший способ добиться того, что вы ищете – Hambone

+0

Я уверен, что есть лучший способ сделать это благодаря попытке помочь. Я ищу более традиционный и простой способ решения этой проблемы. CTE не требуется. IMO – rojobo

0

Вы можете использовать Lateral тоже сво другое решение

SELECT 
    A.CATALOG, A.VENDOR_CODE, A.INVLINK, B.NAME_ID, M.maxmultiflag 
    FROM TBLINVENT_ATTRIBUTE AS A 
    inner join lateral 
    (
    select max(B.multi_flag) as maxmultiflag from TBLINVENT_ATTRIBUTE C 
    where A.VALUE_ID = C.VALUE_ID 
) M on 1=1 
    INNER JOIN TBLATTRIBUTE_VALUE AS B ON M.maxmultiflag = B.VALUE 

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

  • Нет связанных вопросов^_^