2017-07-28 81 views
0

我有一个表(生产商):避免多次加入

Manufacturer ID 
------------------ 
Lagun   1 
Hurco   2 
Mazak   3 
Haas    4 

然后另一个表(库存):

Shop  Lathe DrillPress CNC Mill ID 
------------------------------------------------- 
ABC Inc 2   1   3  3  1 
VECO  4   2   1  2  2 

我需要到结束:

Shop  Lathe DrillPress CNC  Mill 
-------------------------------------------- 
ABC Inc Hurco Lagun  Mazak Mazak 
VECO  Haas  Hurco  Lagun Hurco 

我有此:

SELECT 
    Shop, M1.Manufacturer AS Lathe, M2.Manufacturer AS DrillPress, 
    M3.Manufacturer AS CNC, M4.Manufacturer AS Mill 
FROM Inventory I 
LEFT JOIN Manufacturers M1 ON M1.ID = I.LstFlowMan 
LEFT JOIN Manufacturers M2 ON M2.ID = I.LstFiltFlowMan 
LEFT JOIN Manufacturers M3 ON M3.ID = I.LstFilterMan 
LEFT JOIN Manufacturers M4 ON M4.ID = I.LstEmitMan 

我可能错过了一个更好的方式与枢轴或交叉应用或东西。

+0

我会打赌用这样的查询你会得到最好的表现(当然如果有索引的话)。其他查询可能看起来更好,但很可能他们的表现会更差 –

+0

可能是,但如果库存中有很多字段,则会变长。另外,如果您只想查找一条记录,即WHERE I.ID = 2,我想知道哪条路会更好? –

回答

2

感谢@LauDec,在这里是SQLServer版本:

select * from (
select SHOP, KEYS, MANUFACTURER from 
(select SHOP, LATHE,DRILLPRESS,CNC,MILL from inventory) a 
    unpivot (val for keys in (LATHE,DRILLPRESS,CNC,MILL)) as unpvt 
    JOIN Manufacturers M ON M.ID=VAL 
) a 
PIVOT (
MAX(MANUFACTURER) 
FOR keys in (LATHE,DRILLPRESS,CNC,MILL) 
) as pp 
+0

请参阅?我知道有一个更好的方法。谢谢大家。 –

2

这是一种方法。

SELECT i.shop, 
     lathe = Max(CASE WHEN i.lathe = m.id THEN m.manufacturer END), 
     drillpress = Max(CASE WHEN i.drillpress = m.id THEN m.manufacturer END), 
     mill = Max(CASE WHEN i.mill = m.id THEN m.manufacturer END), 
     cnc = Max(CASE WHEN i.cnc= m.id THEN m.manufacturer END) 
FROM manufacturers m 
     JOIN inventory i 
     ON m.id IN (i.lathe, i.drillpress, i.cnc, i.mill) 
GROUP BY i.shop 

考虑更改inventory表的表结构。

库存:Shop,MachineType,ManufacturerID

然后你可以使用数据透视/交叉选项卡,得到的结果

2

可以逆转置JOIN和RE-PIVOT

SELECT * FROM (
select SHOP, KEYS, MANUFACTURER from 
inventory unpivot (val for keys in ("LATHE","DRILLPRESS","CNC","MILL")) 
JOIN Manufacturers M ON M.ID=VAL 
) PIVOT (
MAX(MANUFACTURER) 
FOR keys in ('LATHE','DRILLPRESS','CNC','MILL') 
) 
+0

Oracle语法。将不得不适应它为sql-server – LauDec