如何在有条件操作的列上联接表

时间:2019-09-06 21:22:29

标签: sql sql-server

我需要操纵我的机器列,以在品牌为AA时删除前导零。然后,我需要加入所有表格。我可以单独执行每个步骤,但是我不知道如何在一个sql语句中执行所有操作。我没有创建新表的能力。这是我的桌子的例子。所有表都有20列以上。

表1

CUNO   CUNM              OtherColumnsT1
1      Joe Construction  Blah
2      City of A         Blah
3      City of B         Blah

table2

Make  Machine   CUNO   OtherColumnsT2
AA    0123      3      Blah
ZZ    J623      2      Blah
AA    0124      2      Blah
KK    0241      1      Blah

table3

SerialNum  HeaderID  OtherColumnsT3
J623       1         Blah
123        2         Blah
0241       3         Blah
124        4         Blah

table4

HeaderID  SegmentID  Color  OtherColumnsT4
1         1          R      Blah
1         2          G      Blah
1         3          Y      Blah
2         1          G      Blah
2         2          G      Blah
3         1          R      Blah
4         1          G      Blah

在一些帮助下,我得到了这段代码,该代码在处理“机器”列并将其与表3合并方面做得很好。

SELECT *
FROM table2 m
INNER JOIN table3 c
ON m.Machine=c.SerialNum
WHERE m.Machine<>'AA'
UNION ALL
SELECT *
FROM table2 m
INNER JOIN table3 c
ON RIGHT(m.Machine,LEN(m.Machine) - 1)=c.SerialNum
WHERE m.Make='AA'

但是我仍然需要联接表1和4。

我尝试在上述代码中添加更多UNION,但这给我带来了一些错误。

我正在寻找这样的桌子

CUNO CUNM              Make Machine HeaderID  OtherColumnsT3 SegmentID Color OtherColumnsT4
1    Joe Construction  KK   0241    3         Blah           1         R     Blah
2    City of A         ZZ   J623    1         Blah           1         R     Blah
2    City of A         ZZ   J623    1         Blah           2         G     Blah
2    City of A         ZZ   J623    1         Blah           3         Y     Blah
2    City of A         AA   124     4         Blah           1         G     Blah
3    City of B         AA   123     2         Blah           1         G     Blah
3    City of B         AA   123     2         Blah           2         G     Blah        

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

select t1.CUNO, t1.CUNM, t2.Make, t2.Machine, t3.HeaderID, t4.SegmentID, t4.Color
from t1
join t2 on t2.CUNO = t1.CUNO
join t3 on ((t3.SerialNum = t2.Machine and len(t3.SerialNum) = len(t2.Machine)) or
(('0' + t3.SerialNum) = t2.Machine and len(t3.SerialNum) = 3))
join t4 on t4.HeaderId = t3.HeaderID
order by t1.CUNO

答案 1 :(得分:0)

我将join的逻辑简化为:

 on t2.Machine = t3.SerialNum or
    (t2.Machine = '0' + t3.SerialNum and t2.make = 'AA') 

甚至:

on t2.Machine in (t3.SerialNum, '0' + t3.SerialNum)

我不确定是否真的需要AA

主要警告是,在JOIN中使用此类表达式通常会降低性能。如果这是一个问题,那么您应该问另一个关于性能的问题。