关于多表SELECT,请MSSQL2000高手支招。
数据库为MSSQL2000,如以下三表:员工表、员工爱好表、爱好配置表
DB_Emp:员工
--------------------
Emp_Id name
1 张三
2 李四
3 杜明
4 李果
5 赵刚
DB_Emp_Like:员工爱好
---------------------
Emp_Id Like_No
1 101
1 102
1 105
3 101
3 105
4 101
4 102
5 101
5 102
5 103
DB_Like:爱好表
--------------------
Like_No Name
101 打篮球
102 打乒乓球
103 唱歌
104 登山
105 游泳
如上三表,现在有一需求,公司根据需要可能会根据情况查询同时具备几个爱好的员工来组织活动,请为怎么查询?
目前我能在MSSQL2008下通过FOR XML PATH能实现,不知道在MSSQL2000下怎么实现??? 谢谢!
[解决办法]
我来猜一个
2000需要用函数来实现
--> 测试数据:[DB_Emp]IF OBJECT_ID('[DB_Emp]') IS NOT NULL DROP TABLE [DB_Emp]GO CREATE TABLE [DB_Emp]([Emp_Id] INT,[name] VARCHAR(4))INSERT [DB_Emp]SELECT 1,'张三' UNION ALLSELECT 2,'李四' UNION ALLSELECT 3,'杜明' UNION ALLSELECT 4,'李果' UNION ALLSELECT 5,'赵刚'--> 测试数据:[DB_Emp_Like]IF OBJECT_ID('[DB_Emp_Like]') IS NOT NULL DROP TABLE [DB_Emp_Like]GO CREATE TABLE [DB_Emp_Like]([Emp_Id] INT,[Like_No] INT)INSERT [DB_Emp_Like]SELECT 1,101 UNION ALLSELECT 1,102 UNION ALLSELECT 1,105 UNION ALLSELECT 3,101 UNION ALLSELECT 3,105 UNION ALLSELECT 4,101 UNION ALLSELECT 4,102 UNION ALLSELECT 5,101 UNION ALLSELECT 5,102 UNION ALLSELECT 5,103--> 测试数据:[DB_Like]IF OBJECT_ID('[DB_Like]') IS NOT NULL DROP TABLE [DB_Like]GO CREATE TABLE [DB_Like]([Like_No] INT,[Name] VARCHAR(8))INSERT [DB_Like]SELECT 101,'打篮球' UNION ALLSELECT 102,'打乒乓球' UNION ALLSELECT 103,'唱歌' UNION ALLSELECT 104,'登山' UNION ALLSELECT 105,'游泳'--------------开始查询--------------------------IF OBJECT_ID('F_Str') IS NOT NULL DROP FUNCTION F_Str go CREATE FUNCTION F_Str ( @Emp_Id INT )RETURNS VARCHAR(100)AS BEGIN DECLARE @S VARCHAR(100) SELECT @S = ISNULL(@S + ',', '') + c.[Name] FROM [DB_Emp_Like] b , [DB_Like] c WHERE b.[Like_No] = c.[Like_No] AND b.[Emp_Id] = @Emp_Id RETURN @S END go SELECT DISTINCT a.[Emp_Id],a.[name],name=dbo.F_Str(a.[Emp_Id]) FROM [DB_Emp] a,[DB_Emp_Like] bWHERE a.[Emp_Id]=b.[Emp_Id] /*Emp_Id name name----------- ---- ----------------------------------------------------------------1 张三 打篮球,打乒乓球,游泳3 杜明 打篮球,游泳4 李果 打篮球,打乒乓球5 赵刚 打篮球,打乒乓球,唱歌(4 行受影响)*/
[解决办法]
将#4楼改成以下便可
IF OBJECT_ID('F_Str') IS NOT NULL DROP FUNCTION F_Str go CREATE FUNCTION F_Str ( @Like_No INT )RETURNS VARCHAR(100) AS BEGIN DECLARE @S VARCHAR(100) SELECT @S = ISNULL(@S + ',', '') + a.[name] FROM [DB_Emp] a, [DB_Emp_Like] b WHERE a.[Emp_Id] = b.[Emp_Id] AND b.[Like_No] = @Like_No RETURN @S END go SELECT DISTINCT b.[Name],name=dbo.F_Str(a.[Like_No]) FROM [DB_Emp_Like] a,[DB_Like] bWHERE a.[Like_No]=b.[Like_No]