两个表Members和FriendList,如下。需要用SQL语句解决的问题是:
返回一个UserID的表,其中每一个用户的朋友集是Alias的朋友集的超集。(每个用户的朋友都包括Alias的所有朋友,也就是2 7 13 16)
请问如何写SQL呢,用contains么?还是有其他简洁的办法?
Members表:
UserID Alias
1 Superman
2 Batman
3 Robin
4 CatGirl
5 Wonderwoman
6 Spiderman
7 Flash
8 Thor
9 Huntress
10 Mr. Incredible
11 Elastigirl
12 Vi
13 Dash
14 Syndrome
15 Mirage
16 Jack-Jack
FriendList表
1 2
2 1
1 7
7 1
1 13
13 1
1 16
16 1
2 4
4 2
2 8
8 2
2 11
11 2
3 2
2 3
3 7
7 3
3 13
13 3
3 16
16 3
3 10
10 3
5 12
12 5
6 7
7 6
12 15
15 12
12 16
16 12
NULL NULL
数据库备份语句参考
这个问题第1个回答:
没看明白。。。。
这个问题第2个回答:
补充一句,FriendList表示的是Members中每个ID的朋友关系
这个问题第3个回答:
前面写错了,应该是
返回一个UserID的表,其中每一个用户的朋友集是Superman的朋友集的超集。(每个用户的朋友都包括Superman的所有朋友,也就是2 7 13 16)
这个问题第4个回答:
SQL code
DECLARE @MemberList TABLE(UserID INT,Alias VARCHAR(20))
DECLARE @FriendList TABLE(UserID INT,FriendID INT)
INSERT INTO @Memberlist
SELECT
1 ,'Superman' UNION ALL SELECT
2 ,'Batman' UNION ALL SELECT
3 ,'Robin' UNION ALL SELECT
4 ,'CatGirl' UNION ALL SELECT
5 ,'Wonderwoman' UNION ALL SELECT
6 ,'Spiderman' UNION ALL SELECT
7 ,'Flash' UNION ALL SELECT
8 ,'Thor' UNION ALL SELECT
9 ,'Huntress' UNION ALL SELECT
10, 'Mr. Incredible' UNION ALL SELECT
11, 'Elastigirl' UNION ALL SELECT
12, 'Vi' UNION ALL SELECT
13, 'Dash' UNION ALL SELECT
14, 'Syndrome' UNION ALL SELECT
15, 'Mirage' UNION ALL SELECT
16, 'Jack-Jack'
INSERT INTO @FriendList
SELECT
1 ,2 UNION ALL SELECT
2 ,1 UNION ALL SELECT
1 ,7 UNION ALL SELECT
7 ,1 UNION ALL SELECT
1 ,13 UNION ALL SELECT
13 ,1 UNION ALL SELECT
1 ,16 UNION ALL SELECT
16, 1 UNION ALL SELECT
2 ,4 UNION ALL SELECT
4 ,2 UNION ALL SELECT
2 ,8 UNION ALL SELECT
8 ,2 UNION ALL SELECT
2 ,11 UNION ALL SELECT
11, 2 UNION ALL SELECT
3 ,2 UNION ALL SELECT
2 ,3 UNION ALL SELECT
3 ,7 UNION ALL SELECT
7 ,3 UNION ALL SELECT
3 ,13 UNION ALL SELECT
13, 3 UNION ALL SELECT
3 ,16 UNION ALL SELECT
16 ,3 UNION ALL SELECT
3 ,10 UNION ALL SELECT
10, 3 UNION ALL SELECT
5 ,12 UNION ALL SELECT
12 ,5 UNION ALL SELECT
6 ,7 UNION ALL SELECT
7 ,6 UNION ALL SELECT
12 ,15 UNION ALL SELECT
15 ,12 UNION ALL SELECT
12 ,16 UNION ALL SELECT
16 ,12 UNION ALL SELECT
NULL, NULL
SELECT *
FROM @MemberList a
WHERE NOT EXISTS
(
SELECT *
FROM @FriendList b
WHERE UserID =1 --superman
AND NOT EXISTS
(
SELECT *
FROM @FriendList c
WHERE a.UserID=c.UserID
AND b.FriendID=c.FriendID
)
)
/*
UserID Alias
----------- --------------------
1 Superman
3 Robin
*/
这个问题第5个回答:
The multi-part identifier "b.FriendID" could not be bound.
返回这个消息啊,第二个查询中定义的b好像不能在第三个查询中用啊。我是SQL Server 2005
这个问题第6个回答:
搞定了 谢谢哦