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 ....主要所有者标记有两个联合账户,在两个联合账户上,共同所有者是杰里。所以不应该显示马克的账户。
如果是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
)
我想知道,我的查询是否会提供良好的性能?
答案 0 :(得分: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]