2013-06-21 2 views
0

Я получил этот запрос, который я использую в одном из моих PHP приложения:Как улучшить этот запрос

SELECT DictSchemeName.schemeName, DictTableName.tableName 
FROM DictSchemeName, DictTableName 
WHERE DictSchemeName.Id = (SELECT schemeName 
          FROM ServiceSublayer 
          WHERE sId = 3 
          AND ServiceId = (SELECT Id 
               FROM Service 
               WHERE applicationId = 'prga')) 
    AND DictTableName.Id = (SELECT tableName 
          FROM ServiceSublayer 
          WHERE sId = 3 
          AND ServiceId =(SELECT Id 
              FROM Service 
              WHERE applicationId = 'prga')); 

, как вы можете видеть, что я в два раз почти тот же запрос в 2 раза (DictSchemeName и DictTableName), я просто начните изучать SQL, и я был бы очень рад, если бы кто-то мог мне помочь.

Я usng MS SQL SERVER 2008

+1

Вы можете использовать ** 'inner join' ** – Luv

ответ

6

Вы должны быть в состоянии соединить таблицы:

select ds.schemeName, 
    dt.tableName 
from 
(
    select schemeName, tableName 
    from ServiceSublayer 
    where sId = 3 
    and ServiceId = (SELECT Id 
        FROM Service 
        WHERE applicationId = 'prga') 
) s 
inner join DictSchemeName ds 
    on s.schemeName = ds.id 
inner join DictTableName dt 
    on s.tableName = dt.id; 

Или еще дальше:

select ds.schemeName, 
    dt.tableName 
from ServiceSublayer ss 
inner join Service s 
    on ss.serviceId = s.id 
inner join DictSchemeName ds 
    on ss.schemeName = ds.id 
inner join DictTableName dt 
    on ss.tableName = dt.id 
where ss.sId = 3 
and s.applicationId = 'prga'; 
0

разбить выбирает на отдельные заявления ...

DECLARE @ServiceId INT 
DECLARE @schemeName VARCHAR 
DECLARE @tableName VARCHAR 

SELECT @ServiceId = Id 
FROM Service 
WHERE applicationId = 'prga' 

SELECT @schemeName=schemeName,@tableName=tableName 
FROM ServiceSublayer 
WHERE ServiceId = @ServiceId AND sId = 3 

SELECT DictSchemeName.schemeName, DictTableName.tableName 
FROM DictSchemeName, DictTableName 
WHERE DictSchemeName.Id = @schemeName 
AND DictTableName.Id = @tableName 
1

Используйте параметр «Включить фактический план выполнения» при анализе каждого из этих запросов. С этим вы сможете увидеть, как вы на самом деле улучшаете каждый запрос. Вот одна из многих статей, которые показывают, как читать планы запросов. http://www.mssqltips.com/sqlservertip/1630/how-to-use-a-sql-server-plan-guide-to-tune-queries/

Как вы следите за тем, как выполнение объединений и исключение подзапросов и коррелированных подзапросов влияет на ваши планы выполнения, вы получите лучшее понимание MSSQL и иметь возможность кодировать лучше в будущем.