Индекс SQL Server для нескольких столбцов таблицы - PullRequest
0 голосов
/ 26 мая 2018

Я написал запрос, который использует два столбца, и каждый из этих столбцов взят из разных таблиц.Как я могу сделать индекс для этих столбцов и возможно ли это вообще?

select countryName, balance
from main.country c 
join main.person p on (c.countryId = p.countryId)
where balance = (select MAX(balance) 
                 from main.person p2 
                 join main.country c2 on (c2.countryId = p2.countryId)
                 where c.countryId = c2.countryId 
                   and p.countryId = p2.countryId)
order by countryName;

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

В SQL Server , если вы хотите создать индекс для столбцов из разных таблиц, тогда вы можете создать Схематическое представление схемы и построить свой индекс поверх этого представления.

В вашем случае создайте представление с привязкой к схеме:

CREATE VIEW MyBoundView
WITH SCHEMABINDING  
AS  
   -- YOU QUERY 
   select countryName, balance
   from main.country c join main.person p on(c.countryId=p.countryId)
   where balance=(select MAX(balance) from main.person p2 join main.country c2 
   on(c2.countryId=p2.countryId)
   where c.countryId=c2.countryId and p.countryId=p2.countryId)
   order by countryName;  

GO  

Теперь вы можете создать индекс с двумя столбцами в этом просмотре с привязкой:

--Example index on the bound view.  
CREATE UNIQUE CLUSTERED INDEX IDX_V1   
   ON MyBoundView (countryName, balance);  
GO  

Выможет найти эту статью полезной.

0 голосов
/ 26 мая 2018

Это ваш запрос:

select countryName, balance
from main.country c join
     main.person p
     on c.countryId = p.countryId
where balance = (select MAX(balance)
                 from main.person p2 join
                      main.country c2
                      on c2.countryId = p2.countryId
                 where c.countryId = c2.countryId and p.countryId = p2.countryId
                )
order by countryName;

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

select top (1) with ties c.countryName, p.balance
from main.country c join
     main.person p
     on c.countryId = p.countryId
order by rank() over (partition by c.countryId order by p.balance desc);

Чтобы получить их в порядке по названию страны, вам нужен подзапрос:

select cp.*
from (select top (1) with ties c.countryName, p.balance
      from main.country c join
           main.person p
           on c.countryId = p.countryId
      order by rank() over (partition by c.countryId order by p.balance desc)
     ) cp
order by countryName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...