三重加入每个独特的结果?

时间:2016-04-28 14:27:38

标签: sql oracle join

我正在编写3个版本的查询,每个版本的条件略有不同。但是,我想像提供的连接图一样加入它们。我不希望任何报告有任何重复,所以我特别希望A获得A的所有独特结果,并且包含A,B和B的交叉。 C.然后我喜欢B包含B和B& B的交叉的所有独特结果。 C.最后C只有C的所有独特结果。

enter image description here

查询本身运行正常,结构如下:

enter image description here

如果我认为结构错误或者可能写得更好,我会想到它吗?

任何帮助破解这一点将不胜感激。

1 个答案:

答案 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>);