SQL根据一列的数据连接不同的列时获取数据

时间:2015-05-16 07:52:55

标签: sql oracle

我想获得Type,Label1 Label2和NUM

when Type from TABLE1 = Type Table 2 
AND if type from Table1 = x i want Label1 from table1 = Label from Table2
    If type from table1 = Y I want LAbl~el2 from table1 = Label from table2

enter image description here

例如: 如果Table1在名为Label的collunm中将Lable1和Lable2放在一起,我会这样做:

SELECT t1.type, t1.Label, t2.NUM
FROM Table1 t1
     Table2 t2
WHERE t1.type = t2.typ2 and
      t1.LABEL = t2. LABEL

但在我的场景中,我在表1中有两个标签。标签1表示X型,标签2表示Y型。

那么优雅高效的方式(假设表中有很多数据)是什么:

select the data t1.Type, t1.Label1 t1.Label2 and t2.NUM when:
t1.type = t2.type2 
and If t1.type = 'X' -> t1.Label1 = t2.Label
and If t1.type = 'Y' -> t1.label2 = t2.Label?

这应该是我想做的选择的结果: enter image description here

2 个答案:

答案 0 :(得分:1)

根据条件加入。 (我假设空白值为空)..

SELECT t1.type, t1.Label1, t1.Label2, t2.NUM
FROM Table1 t1,
     Table2 t2
WHERE t1.type = t2.type and
      Isnull(t1.LABEL1,t1.LABEL2)  = t2. LABEL

答案 1 :(得分:1)

正如Abdul建议的那样,根据label1的值,根据label2type加入;您可以使用case语句来执行此操作:

SELECT t1.type, t1.label1, t1.label2, t2.num
FROM table1 t1
JOIN table2 t2
ON t2.type = t1.type
AND t2.label = CASE WHEN t1.type = 'X' THEN t1.label1 ELSE t1.label2 END;

T LABEL1 LABEL2        NUM
- ------ ------ ----------
X DOC                 1000
X INV                 2000
Y        VAL          3000

您也可以在此处使用decode,但case更通用。这实际上为您提供了一个虚拟组合列来加入,您可以通过查看table1添加该案例表达式来实现可视化:

SELECT t1.type, t1.label1, t1.label2,
  CASE WHEN t1.type = 'X' THEN t1.label1 ELSE t1.label2 END AS label
FROM table1 t1;

T LABEL1 LABEL2 LABEL
- ------ ------ -----
X DOC           DOC  
X INV           INV  
X MAT           MAT  
Y        VAL    VAL  
Y        VIE    VIE  
Y        TRU    TRU  

如果您确定只填充了一个标签列,哪一个总是依赖于该标志,您还可以使用coalesce来获取要加入的值:

SELECT t1.type, t1.label1, t1.label2, t2.num
FROM table1 t1
JOIN table2 t2
ON t2.type = t1.type
AND t2.label = COALESCE(t1.label1, t1.label2);

使用获得相同结果的样本数据。但是案例方法可能更安全,以防两个列都被填充。