0

这是我的第一张桌子:

在此处输入图像描述

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

在此处输入图像描述

我想检索“activity_cc”列的 first_name

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

如何检索这些值?

4

4 回答 4

3

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

第一个范式(或 1NF)要求表的每一列中的值都是原子的。原子性是指列中没有值集。

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

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

于 2013-06-06T14:05:59.540 回答
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

于 2013-06-07T04:06:33.457 回答
0

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;
于 2015-01-07T14:26:49.810 回答
0

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

于 2013-06-06T13:33:38.343 回答