2014-05-23 2 views
-1

У меня есть три таблицы, как показано в следующем формате.Нужна помощь в Sql Query, соединяющем три таблицы

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','[email protected]' union 
select 202,'test2','[email protected]' UNION 
select 203,'test3','[email protected]' 

insert into emailusers 
select 100,'sample','[email protected]' union 
select 101,'sample2','[email protected]' union 
select 102,'sample3','[email protected]' 
select * from Information 
select * from userdata 
select * from emailusers 

из приведенных выше трех таблиц я хочу, чтобы результат, как показано ниже

TOMails(column1)          
[email protected],[email protected], 
[email protected] 

CCEmail (colum2) 
[email protected],[email protected],[email protected]              
+1

Ваша конструкция стола должна быть изменена. Почему у вас есть три разделенных запятой pk в информационной таблице? –

+0

Я согласен с Боратом, это не конструктивный дизайн стола. Тем не менее, как насчет вашего фактического кода, чтобы получить желаемые результаты? –

+0

вместо того, чтобы перерисовывать схему таблиц, можем ли мы получить результат? –

ответ

1

Создать такую ​​функцию:

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)[email protected]) 
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 

Что дает результаты, как и вы ant, независимо от ваших данных.

SQL Fiddle

совмещал эти два ответа: необходим

Convert multiple rows into one with comma as separator

Tsql split string

+0

В настоящее время у меня есть только 3 идентификатора электронной почты позже, я могу указать n число столбцов на том, как заставить его работать –

+0

Вам нужно будет добавить еще «SUBSTRING». Как упоминалось другими, это действительно не очень хороший подход в дизайне стола. – AndLev

Смежные вопросы