在WHERE子句

时间:2015-09-30 17:31:43

标签: tsql

我有一张表,为了我们的目的,这里有2列,第一列代表第二列中的组。这不是传统的数据分组方式,但这是我必须要处理的。以下是该表的测试视图:

mfr_code  |  group
ABC       |  ABC,FFF,XYZ
DEF       |  DEF,GGG
GHI       |  GHI,PPP,RRR

我需要一个链接到mfr_code列的JOIN,然后确定第二列中的所有单个mfr_codes。

此表将加入的表格如下所示:

from_catcode  |  partno  |  mfr_code
DORC          |  1234    |  ABC

加入后,我需要能够生成一个看起来像这样的表:

from_catcode  |  partno  |  mfr_code
DORC          |  1234    |  ABC
DORC          |  1234    |  FFF
DORC          |  1234    |  XYZ

我一直在试图弄清楚如何解析这个多值列,但我担心循环是不切实际的,因为我们讨论的是循环遍历两个表的每个记录,一个在另一个内,对于成千上万的记录。

任何有关我可以进一步研究的见解或方向都会有所帮助。

1 个答案:

答案 0 :(得分:1)

您可以在单个语句中拆分和加入表。请尝试下面的代码

    DECLARE @MrfDesc TABLE
(
    mrf_code varchar(10), groups varchar(50)
)
INSERT INTO @MrfDesc VALUES
('ABC','ABC,FFF,XYZ'),
('DEF','DEF,GGG'),
('GHI','GHI,PPP,RRR')

DECLARE @mrfMajor TABLE (from_catcode varchar(20) ,  partno INT  , mfr_code varchar(10))
INSERT INTO @MrfMajor VALUES('DORC',1234,'ABC')

SELECT MMajor.from_catcode, MMajor.partno, subset.Certs FROM @mrfMajor MMajor JOIN (
SELECT mrf_code,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
FROM
(SELECT mrf_code,CAST('<XMLRoot><RowData>' + 
                        REPLACE(groups,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
        FROM   @MrfDesc)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n) ) subset 
ON subset.mrf_code = MMajor.mfr_code

SQL Fiddle demo