加入查询逗号分隔值

时间:2013-06-06 08:16:14

标签: sql sql-server-2008

这是我的第一张表:

enter image description here

这是我想要执行连接操作的另一个表:

enter image description here

我想检索“activity_cc”列的第一个名称

例如,我想显示Pritam,Niket for activity_id = 2

如何检索这些值?

4 个答案:

答案 0 :(得分:3)

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

  

第一个普通形式(或1NF)要求每列中的值   一张桌子是原子的。原子,我们的意思是没有一套   列中的值。

您的数据库设计违反了第一种常规形式的数据库设计。这是一个简单的不可行的设计,必须进行更改(坦率地说,创建这个的数据库设计者应该被解雇,因为这是严重的无能)或者会出现严重的性能问题,并且查询总是很困难。数据库设计的第一条规则永远不会在一个字段中存储多条信息是有原因的。

是的,你可以使用一些黑客方法来获得你想要的答案,但它们会导致性能问题而且它们是错误的要做的事情。将这些数据修复到一次性使用的相关表中的hack很好,一个hack来连续查询你的数据库只是一个糟糕的选择。从长远来看,将这种癌症作为数据库的核心,现在将花费更少的时间。但一般来说,修复此问题的过程是使用某些版本的fn_split将数据拆分为相关表(查找脚本的各种实现以创建函数)。您可以在查询中使用临时表,或执行正确事物并修复数据库。

答案 1 :(得分:0)

如果您想在Join的基础上检索结果,那么为什么不使用inner-join加入“registration_id”上的两个表。请清除我想要在active_cc上执行连接,但它实际上不存在于您的第二个表中。那么在这种情况下如何预先加入。

答案 2 :(得分:0)

我完全同意@HLGEM,但要解决这个特殊问题,成本会很高。 我试过想要你想在这里取得成功。如果需要,请修改join。 如果需要任何进一步的帮助,请告诉我。

示例架构

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';

示例查询

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

已添加到SQLFiddle

答案 3 :(得分:0)

考虑Pratik的结构

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';

你可以这样做:

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;