SQL在根据一列的数据连接不同列时获取数据
我想得到类型,Label1,Label2和NUMSQL在根据一列的数据连接不同列时获取数据,sql,oracle,Sql,Oracle,我想得到类型,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 例: 如果表1中的标签1和标签2位于一个命名标签中,我会: SELEC
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
例:
如果表1中的标签1和标签2位于一个命名标签中,我会:
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
那么,什么是优雅而高效的方法(假设表中有大量数据)来:
这应该是我要进行的选择的结果:
根据条件加入。(我假设空白值为null)
正如Abdul所建议的,根据
label1
或label2
,基于type
的值进行连接;您可以使用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
更通用。这有效地为您提供了一个虚拟的组合列,您可以通过查看添加了case表达式的表1来可视化该列:
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);
使用获得相同结果的示例数据。但是case方法可能更安全,以防两列都被填充。yes空格值为null。。非常感谢您的快速帮助,这将提供我刚才编辑的结果?添加where子句:“and t2.type is not null”以排除cie&truie和TRU应该已经排除,因为t1.type=t2.type“如果您确定只填充了一列,并且哪一列始终取决于标志(在这种情况下,为什么有两个标签列?)这不是我的决定我正在处理一个这样设计的DB…我不认为我需要select上的大小写,因为即使标签1或2是空的,我想选择所有方式t1.type,t1.label1,t1.LABELE2,t2.num…我将在Where和t2.Label=case上尝试大小写,当t1.type='X'然后t1.label1 EL1 ELS t1.label2结束;@UcanDoIt-对,我把你的第一个查询和你想要的实际输出搞混了,抱歉-修复了。单列只是一个过眼云烟的想法(当然,通用列可能会被滥用,因此无论如何,拥有两列可能是首选),我已经删除了这一点,因为它不相关。
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
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);