首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 数据库开发 >

请问一个 SQL 查询

2012-02-02 
请教一个 SQL 查询假设有一个表有如下记录IDName1A1A2B2B3B在这个表中,对应字段 name 等于 A 时,字段 ID

请教一个 SQL 查询
假设有一个表有如下记录

ID Name
1 A
1 A
2 B
2 B
3 B


在这个表中,对应字段 name 等于 A 时,字段 ID 只有一个值 1 与之对应; 对应字段 name 等于 B 时,字段 ID 有两个值 2 和 3 与之对应。

要求,把表中对应字段 Name的一个值,字段 ID 有两个或两个以上的值与之对应的行列出来。

对应上表,则列出的结果为 

ID Name
2 B
3 B

万分感谢!

[解决办法]

SQL code
select *from 一个表 twhere exists (select id from 一个表 where name=t.name and id<>t.id)
[解决办法]
有很多种写法:

假设表名为t。
方法1:
SELECT
tab1.id
, tab1.name
FROM
(
SELECT id, name, COUNT(*) AS cnt
FROM t
GROUP BY id, name
) tab1

(
SELECT name, COUNT(*) AS cnt
FROM t
GROUP BY id
) tab2
WHERE tab1.name = tab2.name
AND tab1.cnt <> tab2.cnt
;
方法2:
SELECT
id
, name
FROM t AS t1
WHERE EXISTS
(
SELECT *
FROM t AS t2
WHERE t1.name = t2.name AND t1.id <> t2.id
)
GROUP BY id, name
;
方法3:
SELECT t1.id, t1.name
FROM t AS t1, t AS t2
WHERE t1.name = t2.name AND t1.id <> t2.id
GROUP BY id, name
;
性能考虑:如果数据量很大的话,可以先求出 (select id, name from t group by id, name) 这个中间结果集,再对这个结果集进行上述方法2,3的查询,这样性能较高。

热点排行