簡體   English   中英

聯接查詢逗號分隔值

[英]Join query on comma separated values

這是我的第一張桌子:

在此處輸入圖片說明

這是我要對其執行聯接操作的另一個表:

在此處輸入圖片說明

我想檢索“ activity_cc”列的名字

例如,我想顯示Activity_id = 2的Pritam,Niket

如何獲取這些值?

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

第一種范式(或1NF)要求表的每一列中的值都是原子的。 原子的意思是一列中沒有值的集合。

您的數據庫設計違反了數據庫設計的第一種常規形式。 這是一個完全不可行的設計,必須進行更改(坦率地說,創建此設計的數據庫設計人員應被解雇,因為這是嚴重的無能),否則將出現嚴重的性能問題,並且查詢將始終很困難。 有一個原因為什么數據庫設計的第一條規則永遠不會在一個字段中存儲多個信息。

是的,您可以使用一些破解方法來獲得所需的答案,但是它們會導致性能問題,而且這是錯誤的做法。 一次將這些數據修復到相關表中的技巧是不錯的選擇,持續查詢您的數據庫的技巧只是一個糟糕的選擇。 從長遠來看,現在將這種癌症修復到數據庫的核心位置將花費更少的時間。 但是通常,解決此問題的過程是使用某些版本的fn_split將數據拆分到相關的表中(查找此腳本的各種實現以創建腳本來創建函數)。 您可以在查詢中使用臨時表,也可以做正確的事並修復數據庫。

如果要基於Join檢索結果,那么為什么不通過使用inner-join在“ registration_id”上將兩個表聯接在一起。 並請向我說明您要在active_cc上執行聯接,但實際上在第二個表中不存在該聯接。 那么在這種情況下如何進行瓶坯連接。

我完全同意@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

考慮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;

要么

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM