希望有人可以在这里帮助我,因为我似乎在圈子里走路,因为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;
任何帮助或指针将不胜感激!
答案 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));
如果您需要制作系列或代码组,只需为其添加一列。