-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.... 的情况下,主要所有者标记有两个联名账户,并且在这两个联名账户上,联合所有者是 jerry。因此不应显示 Mark 的帐户。

在 mnbr 的情况下:350、450、550

Jim 有 3 个联名账户,并且这三个联名账户并非都属于同一个联名所有者。所以必须显示所有 3 个帐户。

Mnbr 650 只有一个联名账户和一个联名所有者。所以不应该显示。

我编写了以下查询,该查询返回我需要的数据。

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 回答