SQL - 根据条件加入矩阵

时间:2015-06-16 10:43:13

标签: sql sql-server

希望有人可以在这里帮助我,因为我似乎在圈子里走路,因为SQL并不是我的强项。 如果我可以通过加入来解决问题,我会感到茫然,但我怀疑没有。

问题: 基本上我有一个表,我需要在查找表中匹配代码,以查看哪些代码有效,哪些代码无效。

表:tblMatrix

ID      family0 family1 family2 family3 family4
1000    AAALL   ZZZAA   11111   NULL    NULL
1001    AAALL   ZZZAA   11122   NULL    NULL
1002    AAALL   ZZZBB   11111   NULL    NULL
1003    AAALL   ZZZBB   11122   NULL    NULL
1004    AAARR   ZZZAA   11111   NULL    NULL
1005    AAARR   ZZZAA   11122   XXX11   NULL
1006    AAARR   ZZZBB   11111   NULL    NULL
1007    AAARR   ZZZBB   11122   NULL    NULL

对比下表: tblComparision

ID      code1   code2   code3   code4
4034    AAALL   11122   NULL    NULL
5555    AAARR   ZZZAA   NULL    NULL
6667    11122   AAARR

在存储过程中,我循环tblMatrix中的每一行,并且基本上需要计算tblComparison中是否存在任何代码组合。 因此,例如,ID 1000有效,因为不存在组合。但是,ID 1001无效,因为AAALL和11122都已发生。

另请注意,代码的顺序可能不正确,因此ID 1007无效,因为AAARR和11122都存在。

关于如何实现这一目标的任何想法。几个连接会起作用吗?

我最接近它的工作是在下面。基本上,当I family1不匹配但是不确定如何避免这种情况时,它会开始失败。

select * from tblMatrix2 as t1
join tblComparison as t2
on 
(t1.family0 = t2.code1  or t1.family0 = t2.code2  or t1.family0 = t2.code3 )
join tblComparison as t3
on
    (t1.family1 = t3.code1 or t1.family1 = t3.code2 or t1.family1 = t3.code3 )
join tblComparison as t4
on
    (t1.family2 = t4.code1 or t1.family2 = t4.code2 or t1.family2 = t4.code3 )
where t1.id = 10001;

任何帮助或指针将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以通过制作union字段列出所有值(此处不会显示匹配项):

 SELECT sub.id,
         CASE WHEN MAX (sub.cn) = 1 THEN 'Valid' ELSE 'Invalid' END status
    FROM (  SELECT fam.id, COUNT (lst.id) cn
              FROM    (SELECT id, family0 family FROM tblMatrix
                       UNION ALL
                       SELECT id, family1 FROM tblMatrix
                       UNION ALL
                       SELECT id, family2 FROM tblMatrix
                       UNION ALL
                       SELECT id, family3 FROM tblMatrix
                       UNION ALL
                       SELECT id, family4 FROM tblMatrix) fam
                   INNER JOIN
                      (SELECT id, code1 code FROM tblComparison
                       UNION
                       SELECT id, code2 FROM tblComparison
                       UNION
                       SELECT id, code3 FROM tblComparison
                       UNION
                       SELECT id, code4 FROM tblComparison) lst
                   ON fam.family = lst.code
             WHERE fam.family IS NOT NULL AND lst.code IS NOT NULL
          GROUP BY fam.id, lst.id) sub
GROUP BY sub.id
ORDER BY id

奖金信息: 这些联合列表将您的表转换为sql中可管理的内容,没有重复列(如code1,code2等)。您可以相应地更改表格以获得更好的数据模型(无NULL):

create table tblMatrix (id int, family varchar2(5));
create table tblComparison (id int, code varchar2(5));

如果您需要制作系列或代码组,只需为其添加一列。