Создание более эффективного SQL-запроса

Или, если Вы хотите пойти твердым путем, добавьте ссылку на свой проект для Microsoft. VisualBasic и затем используют следующее:

Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(fromDirectory, toDirectory);

Однако использование одной из рекурсивных функций является лучшим способом пойти, так как это не должно будет загружать VB dll.

6
задан Eric 31 July 2009 в 04:36
поделиться

3 ответа

Вы хотите использовать для этого ROW_NUMBER () или RANK ().

(и убедитесь, что что предыдущий запрос заканчивается точкой с запятой)

with ranked as
(
select *, row_number() over (partition by key order by val desc) as bestrow
from sometableorquery 
)
select *
from ranked
where bestrow = 1
order by key;

Если вам нужны связи (чтобы ключ, имеющий два лучших значения, возвращал оба), используйте rank () вместо row_number ().

Роб

0
ответ дан 17 December 2019 в 22:14
поделиться

Есть, но это, конечно, не очевидно:

select
    *
from
    (
    select
        key,
        val,
        col,
        max(val) over (partition by key) as MaxVal
    from
        tableA
    )
where
    val = MaxVal

Использование предложения over - отличный способ сделать это и не требует никаких посторонних подзапросов. Все, что он делает, это берет максимальное значение для каждого ключа, а затем обертывает этот набор результатов в подзапрос, где мы можем сравнить значение с MaxVal , чтобы получить уверен, что мы выбираем правильную строку.

Намного чище и быстрее, чем выполнение до трех подзапросов!

2
ответ дан 17 December 2019 в 22:14
поделиться

Я бы выделил ваши подзапросы во временные таблицы, прежде чем выбирать из них. Думаю, от этого вы заметите значительный прирост производительности.

-1
ответ дан 17 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: