Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Sql查询连接三个表的帮助吗_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

需要Sql查询连接三个表的帮助吗

需要Sql查询连接三个表的帮助吗,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有三个表格,如下表所示 create table Information(InfoID int, TOEmailIDKey varchar(100), CCEmailIDKey varchar(100)) create table userdata(UserKey int, name varchar(50), EmailIDs varchar(100)) create table emailusers(EmailUserKey int, username varchar(100

我有三个表格,如下表所示

create table Information(InfoID int, TOEmailIDKey varchar(100),
      CCEmailIDKey varchar(100))

create table userdata(UserKey int, name varchar(50), EmailIDs varchar(100))

create table emailusers(EmailUserKey int, username varchar(100), 
       UsersMailIDs varchar(100))


insert into Information select 1,'100,101,102','201,202,203'

insert into userdata

select 201,'test','Test@test.com' union
select 202,'test2','Test2@test.com' UNION
select 203,'test3','Test3@test.com' 

insert into emailusers
select 100,'sample','sample@test.com' union
select 101,'sample2','sample2@test.com' union
select 102,'sample3','sample3@test.com' 
select * from Information
select * from userdata
select * from emailusers
从以上三个表中,我希望输出如下

TOMails(column1)                                       
sample@test.com,sample2@test.com,
sample3@test.com 

CCEmail (colum2)
Test.@test.com,Test2@test.com,Test3@test.com                                                     

创建如下函数:

CREATE FUNCTION dbo.splitstring (@stringToSplit varchar(MAX))
RETURNS 
@returnList TABLE ([Name] [nvarchar] (500))
AS 
BEGIN

DECLARE @name nvarchar(255)
DECLARE @pos INT

WHILE CHARINDEX (',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX (',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

INSERT INTO @returnList
SELECT @name

SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END 
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
GO
然后您可以执行以下操作:

DECLARE @string varchar(50)
DECLARE @tmp VARCHAR(250)
SET @string = (SELECT CCEmailIDKey FROM Information)
SET @tmp = ''

SELECT @tmp = @tmp + EmailIDs + ', ' 
FROM
(
    SELECT 
      u.EmailIDs 
    FROM 
      userdata u 
        JOIN dbo.splitstring(@string) s ON u.UserKey = s.name
) s

SELECT SUBSTRING(@tmp, 0, LEN(@tmp))
GO

DECLARE @string varchar(50)
DECLARE @tmp VARCHAR(250)
SET @string = (SELECT TOEmailIDKey FROM Information)
SET @tmp = ''

SELECT @tmp = @tmp + UsersMailIDs + ', ' 
FROM
(
    SELECT 
      u.UsersMailIDs 
    FROM 
      emailusers u 
        JOIN dbo.splitstring(@string) s ON u.EmailUserKey = s.name
) s

SELECT SUBSTRING(@tmp, 0, LEN(@tmp))
GO
无论您的数据如何更改,什么都能提供您想要的结果

结合这两个答案:


您的桌子设计需要更改。为什么在信息表中有三个逗号分隔的pk?我同意Borat,这不是一个建设性的表设计。然而,为了得到想要的结果,您的实际代码如何?我们可以不改变表模式而获得输出吗?目前我只有3个电子邮件id,以后我可能有n个列,如何使其工作您将不得不添加更多的
子字符串
。正如其他人提到的,在表设计中,这确实不是一个好方法。