0

PHPアプリケーションの1つで使用する次のクエリがあります。

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) 2 倍にしています。SQL を学び始めたばかりで、誰かが私を助けてくれたらとてもうれしいです。

私はMS SQL SERVER 2008を使用しています

4

3 に答える 3

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';
于 2013-06-21T14:04:52.127 に答える
1

これらの各クエリを分析するときに、[実際の実行計画を含める] オプションを使用します。これにより、各クエリが実際にどのように改善されているかを確認できます。クエリ プランの読み方を示す多くの記事の 1 つを次に示します。 /

結合を実行し、サブクエリと相関サブクエリを回避することが実行計画にどのように影響するかを理解するにつれて、MSSQL の基礎となる理解が深まり、将来的により適切にコーディングできるようになります。

于 2013-06-21T14:22:15.087 に答える
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
于 2013-06-21T14:12:45.380 に答える