-3
 DECLARE  @table TABLE( mnbr int,
  Pid int,
  Pname varchar(10),
  Jid int,
  Jname varchar(10))

INSERT INTO @table
VALUES(150 ,    1   ,    'Mark'   ,   8    ,'Jerry')
,(250  ,   1  ,     'Mark'   ,   8    ,  'Jerry')
,(350  ,   2   ,    'Jim'     ,    9  ,   'Luke')
,(450  ,   2   ,    'Jim'     ,    9   ,  'Luke')
,(550  ,   2   ,    'Jim'     ,    10  ,  'Jude')
,(650  ,   3   ,    'Andy'   ,   11   , 'Matt')
,(750   ,  4   ,    'Brian'   ,    21  ,  'Chris')
,(850   ,  4   ,    'Brian'   ,     7  ,    'Mac')
,(950   ,  5   ,    'Jean '   ,    21   , 'Chris')

上記のデータの場合.....私の出力は次のようになります。

350    2      Jim     9    Luke
450    2      Jim     9    Luke
550    2      Jim     10   Jude
750    4      Brian   21   Chris
850    4      Brian   7      Mac

mnbr 150 と 250 の場合.... 一次所有者マークには 2 つの共同口座があり、両方の共同口座の共同所有者は jerry です。したがって、Mark のアカウントは表示されません。

mnbrの場合:350、450、550

ジムは 3 つの共同口座を持っていますが、3 つの共同口座のすべてが同じ共同所有者に属しているわけではありません。したがって、3 つのアカウントすべてを表示する必要があります。

Mnbr 650 には、共同所有者が 1 人の共同口座が 1 つしかありません。したがって、表示されるべきではありません。

必要なデータを返す次のクエリを作成しました。

SELECT  * FROM @table WHERE pname IN (
SELECT   pname FROM @table
    WHERE pname  IN (SELECT pname FROM @table GROUP BY pname,jname HAVING COUNT(*)!>1)
 GROUP BY pname HAVING COUNT(*)>1
)

知りたいのですが、私のクエリは優れたパフォーマンスを提供しますか?

4

1 に答える 1

1

クエリを少し単純化して

SELECT *
FROM   @table
WHERE  pname IN (SELECT   pname
                 FROM     @table
                 GROUP BY pname
                 HAVING   MAX(jid) <> MIN(jid));

それがより良いパフォーマンスを発揮するかどうかは、質問で提供したデータセットよりもはるかに大きなデータセットに対してテストする必要があるものです。

この場合、より大きなデータセットに対していずれかのクエリを実行する際のより重要な要素は、pname、jnameフィールドまたはpname、jidフィールドの組み合わせのいずれかにインデックスを付けることである可能性が高くなります。

'accounts'のテーブル名を想定すると、有用なインデックスは次のようになります。

CREATE NONCLUSTERED INDEX [IX_accounts_pname_jid] ON [dbo].[accounts] 
(
    [pname] ASC,
    [jid] ASC
)
WITH (PAD_INDEX  = OFF, 
      STATISTICS_NORECOMPUTE  = OFF, 
      SORT_IN_TEMPDB = OFF,
      IGNORE_DUP_KEY = OFF,
      DROP_EXISTING = OFF,
      ONLINE = OFF, 
      ALLOW_ROW_LOCKS  = ON,
      ALLOW_PAGE_LOCKS  = ON)
ON [PRIMARY]
于 2013-02-12T19:04:49.330 に答える