我正在编写3个版本的查询,每个版本的条件略有不同。但是,我想像提供的连接图一样加入它们。我不希望任何报告有任何重复,所以我特别希望A获得A的所有独特结果,并且包含A,B和B的交叉。 C.然后我喜欢B包含B和B& B的交叉的所有独特结果。 C.最后C只有C的所有独特结果。
查询本身运行正常,结构如下:
如果我认为结构错误或者可能写得更好,我会想到它吗?
任何帮助破解这一点将不胜感激。
答案 0 :(得分:1)
在学习SQL时,首先应该注意的是,您使用的是二十多年前过时的连接语法。你学到这一点很奇怪;你必须使用一本非常非常古老的SQL书。连接表t1和t2的正确方法是from t1 inner join t2 on t2.colx = t1.coly
。
你说你在桌子上有三组条件,这导致三个查询你想要组合的结果集(你可以用UNION ALL
)。但是有些记录不止一组,你不需要重复。这都是?您可以使用UNION
实现此目的,与其兄弟UNION ALL
不同,它不仅可以将结果粘合在一起,还可以删除重复项:
select col1, col2, col3
from t1
join t2 on t2.colx = t1.coly
where t1.col4 = 4 or t1.col5 = 5
union
select col1, col2, col3
from t1
join t2 on t2.colx = t1.coly
where t1.col4 = 44 or t1.col5 = 55;
但是,通过组合条件,您可以更轻松地实现这一目标:
select col1, col2, col3
from t1
join t2 on t2.colx = t1.coly
where t1.col4 = 4 or t1.col5 = 5 or t1.col4 = 44 or t1.col5 = 55;
最后一行可以简化为
where t1.col4 in (4, 44) or t1.col5 in (5, 55);
顺便说一下。那已经是你所追求的还是还有什么?
更新:从您的评论到您的请求我收集您想要对您的记录进行排名。与第一个条件集匹配的是组A,然后从剩余的记录中匹配第二个条件集的是B,其余的是C.以下是如何:
select col1, col2, col3,
case when t1.col4 = 4 or t1.col5 = 5 then 'A'
when t1.col4 = 44 or t1.col5 = 55 then 'B'
else 'C'
end as grp
from t1
join t2 on t2.colx = t1.coly
where t1.col4 in (4, 44, 444) and t1.col5 in (5, 55, 555);
或更一般地说:
select col1, col2, col3,
case when <condition set 1> then 'A'
when <condition set 2> then 'B'
else 'C'
end as grp
from t1
join t2 on t2.colx = t1.coly
where (<condition set 1>) or (<condition set 2>) or (<condition set 3>);
还有一次更新:如果您想单独选择C,只需按以下步骤应用所有条件:
select col1, col2, col3
from t1
join t2 on t2.colx = t1.coly
where (<condition set 3>)
and not (<condition set 1>)
and not (<condition set 2>);