SQL SERVER - A Tricky Question and Even Trickier Answer - Index Intersection - Partition Function
SQL SERVER - A Tricky Question and Even Trickier Answer - Index Intersection - Partition Function
When I saw this answer I was very happy because I did not visualize it as a solution when I
was asking the question. Here is the execution plan of the T-SQL code above. Its easy to see that
there are multiple joins because of the Partition Function used in the query. What an excellent
participation by Alphonso Jones.
Click to Enlarge
Here is the answer which I had visualized when I asked the question. I was running the query on
AdventureWorks database and executed the following query, which in turn, generated an
execution plan with multiple joins:
USE
GO
SELECT
FROM
WHERE
GO
AdventureWorks2012
[EmployeeID]
258
*
[Purchasing].[PurchaseOrderHeader]
AND
[VendorID]
=
1580
Look at the execution plan of the above query. You can see the joins even though I am using
single table and there is no join syntax in the query.
Click to Enlarge
Personally, I liked the solution of Alphonso Jones as his solution will always generate multiple
joins due to Partition Function. On the other hand, my solution is a bit tricky for it requires
Indexes on the table [Purchasing].[PurchaseOrderHeader], which generates index
intersection. Index Intersection is a technique which utilizes more than one index on a table to
satisfy a given query.
BACKGROUND
This article demonstrates some commonly asked SQL queries in a job interview. I will be
covering some of the common but tricky queries like:-
INTO
INTO
INTO
INTO
INTO
Employee_Test
Employee_Test
Employee_Test
Employee_Test
Employee_Test
VALUES
VALUES
VALUES
VALUES
VALUES
('Anees',1000);
('Rick',1200);
('John',1100);
('Stephen',1300);
('Maria',1400);
Now, if you are asked to find the 3rd highest salary, then the query is as:Collapse | Copy Code
--3rd Highest Salary
select min(Emp_Sal) from Employee_Test where Emp_Sal in
(select distinct top 3 Emp_Sal from Employee_Test order by Emp_Sal desc)
into
into
into
into
into
into
into
photo_test
photo_test
photo_test
photo_test
photo_test
photo_test
photo_test
values(17,16,'photo/cricket1.jpg');
values(17,17,'photo/base1.jpg');
values(18,18,'photo/forest1.jpg');
values(18,19,'photo/tree1.jpg');
values(18,20,'photo/flower1.jpg');
values(19,21,'photo/laptop1.jpg');
values(19,22,'photo/camer1.jpg');
There are three groups of pgm_main_category_id each with a value of 17 (group 17 has
four records),18 (group 18 has three records) and 19 (group 19 has three records).
Now, if you want to select top 2 records from each group, the query is as follows:Collapse | Copy Code
pgm_sub_category_id
file_path
photo/bb1.jpg
photo/cricket1.jpg
photo/forest1.jpg
photo/tree1.jpg
photo/laptop1.jpg
photocamer1.jpg
INTO
INTO
INTO
INTO
INTO
INTO
INTO
Employee_Test1
Employee_Test1
Employee_Test1
Employee_Test1
Employee_Test1
Employee_Test1
Employee_Test1
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
(1,'Anees',1000);
(2,'Rick',1200);
(3,'John',1100);
(4,'Stephen',1300);
(5,'Maria',1400);
(6,'Tim',1150);
(6,'Tim',1150);
Step 1: Create a temporary table from the main table as:Collapse | Copy Code
select top 0* into employee_test1_temp from employee_test1
Step2 : Insert the result of the GROUP BY query into the temporary table as:Collapse | Copy Code
insert into employee_test1_temp
select Emp_ID,Emp_name,Emp_Sal
from employee_test1
group by Emp_ID,Emp_name,Emp_Sal
Step4: Fill the original table with the rows of the temporary table as:Collapse | Copy Code
insert into employee_test1
select * from employee_test1_temp
Now, the duplicate rows from the main table have been removed.
Collapse | Copy Code
select * from employee_test1
Emp_name
Anees
Rick
John
Stephen
Maria
Tim
Emp_Sal
1000
1200
1100
1300
1400
1150
Emp_name
Anees
Rick
John
Stephen
Maria
Tim
Emp_Sal
1000
1200
1100
1300
1400
1150