简体   繁体   中英

Join query on comma separated values

This is my 1st table :

在此处输入图片说明

this is another table on which i want to perform join operation :

在此处输入图片说明

I want to retrieve first_name for "activity_cc" column

For example, I want to show Pritam,Niket for activity_id=2

How can I retrieve those values?

From http://mikehillyer.com/articles/an-introduction-to-database-normalization/

The first normal form (or 1NF) requires that the values in each column of a table are atomic. By atomic we mean that there are no sets of values within a column.

Your database design violates the first normal form of database design. It is a simply unworkable design and it must be changed (and frankly the database designer who created this should be fired as this is gross incompetence) or there will be severe performance problems and querying will always be difficult. There is a reason why the very first rule of database design is never store more than one piece of information in a field.

Yes you could use some hack methods to get the answer you want, but they will cause performance issues and they are the wrong thing to do. A hack to fix this data into a related table used one-time is fine, a hack to continuallly query your database is simply a poor choice. It will cost less time in the long run to fix this cancer at the heart of your database right now. But in general the process to fix this is to split the data out into a related table using some version of fn_split (look up the various implementations of this for a script to create the function). You can use a temp table in your query or do the right thing and fix the database.

If you want to retrieve the result on the basis of Join then why don't you join your both tables on the "registration_id" by using inner-join. And please clearify me you want to perform the join on the active_cc, but its actually not present in your second table. So how you preform join in that case.

I completely agree with @HLGEM, but to solve this particular problem cost will be high. I had given a try to want you want to achive here. Please modify the join if needed. Let me know if any further help needed.

Sample Schema

create table tableC (ACTIVITY_ID int, REG_ID int,PROJ_ID int,DOSS_ID int,ACTIVITY_TO int, ACTIVITY_CC varchar(500))

insert into tableC select 4, 1,1,1,1, '3,4';
insert into tableC select 5, 2,2,2,2, '5,6';
insert into tableC select 6, 3,3,3,3, '3,5';


create table tableD (REG_ID int , FIRST_NAME  VARCHAR(100), LAST_NAME  VARCHAR(100))

insert into tableD select 3,  'Pritam',  'Sharma';
insert into tableD select 4,  'Pratik',  'Gupta';
insert into tableD select 5,  'Niket',  'Vaidya';
insert into tableD select 6,  'Ajinkya',  'Satwa';

Sample Query

with names as
(
    select C.ACTIVITY_ID,C.ACTIVITY_CC
    ,Names = D.FIRST_NAME
    from tableC C
    inner join tableD D on charindex(cast(D.REG_ID as varchar), C.ACTIVITY_CC) > 0
 )
select 
C.ACTIVITY_ID,C.REG_ID,PROJ_ID,DOSS_ID,ACTIVITY_TO,ACTIVITY_CC
,Names = stuff
(
  (
    select ',' + Names
    from names n
    where n.ACTIVITY_ID = D.REG_ID
    for xml path('')
  )
  , 1
  , 1
  , ''
)
from tableD D
inner join tableC C on C.ACTIVITY_ID = D.REG_ID

Added to SQLFiddle also

Considering Pratik 's structure

CREATE TABLE tableC
(
ACTIVITY_ID int,
REG_ID int,
PROJ_ID int,
DOSS_ID int,
ACTIVITY_TO int,
ACTIVITY_CC varchar(500)
);

INSERT INTO tableC select 4, 1,1,1,1, '3,4';
INSERT INTO tableC select 5, 2,2,2,2, '5,6';
INSERT INTO tableC select 6, 3,3,3,3, '3,5';


CREATE TABLE tableD
(
REG_ID int,
FIRST_NAME VARCHAR(100),
LAST_NAME  VARCHAR(100)
);

INSERT INTO tableD select 3,  'Pritam',  'Sharma';
INSERT INTO tableD select 4,  'Pratik',  'Gupta';
INSERT INTO tableD select 5,  'Niket',  'Vaidya';
INSERT INTO tableD select 6,  'Ajinkya',  'Satwa';

You can do this:

SELECT tableD.FIRST_NAME
FROM tableD
JOIN tableC ON tableC.ACTIVITY_CC LIKE CONCAT('%', tableD.REG_ID, '%')
GROUP BY tableD.FIRST_NAME;

OR

SELECT FIRST_NAME
FROM tableD, tableC
WHERE tableC.ACTIVITY_CC LIKE CONCAT('%', tableD.REG_ID, '%')
GROUP BY tableD.FIRST_NAME;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM