0

我一直在试图弄清楚如何将一个表加入到我加入的其他表中,但是表的设置方式,EventTable只有在某些事件发生时才有OrderID 。否则为空。

事件表

EventID EventName  OrderID DateTS
1       Rec        1       date1
2       Track      NULL    date2
3       Run        NULL    date3

事件项表

 EventID    Column2    OrderID
    1       Other      1
    2       stuff      2
    3       beer       3

订单表

OrderID         orderRef   ProdID
        1       1234       1
        2       1233       1
        3       1232       3

现在我一直在尝试获取所有事件行,其中包含我正在寻找的所有事件。我需要做的是能够允许用户使用 Tableau,它将过滤orderRef列以显示所有发生的事件。

我对 SQL 查询很陌生,我想的每行逻辑是 if 语句,但不知道它在 SQL 中是如何工作的。

SELECT OrderTable.orderRef, EventTable.DateTS, EventTable.EventName

If EventTable.OrderID column isNull, then          

FROM EventItemTable  
  join EventItemTable ON EventItemTable.OrderID = EventTable.OrderID
  join OrderTable ON OrderTable.OrderID = EventItemTable.OrderID

ELSE

 FROM EventItemTable 
  left join OrderTable ON OrderTable.OrderID = EventTable.OrderID

在我看来,我认为 orderRef 将被填充到整个表中并且没有空值或被过滤掉。我仍然可以拥有所有其他列,但在 else 条件下,行将只填充 NULL。我一直在寻找子查询和其他功能来尝试,但没有看到任何似乎能够做到这一点的东西。我正在使用 Microsoft SQL 2005(我相信)

编辑

这就是我最终得到的结果,将所有 OrderID 放在一列中以加入 @AlexJohnson 建议。我现在的问题是,一对夫妇在每个订单参考的行中有重复的制造事件 ID。不确定 ISNULL 是否导致该问题

SELECT met.met_ManufacturingEventID
        ,met.met_OrderID
        ,ori.ori_OrderID
        ,mfi.mfi_OrderID
        ,mfi.mfi_LastEvent
        ,mfi.mfi_RunNumber
        ,mfi.mfi_InputOrder
        ,meo.meo_ManufacturingOperationName
        ,mes.mes_ManufacturingStationName as StationName
        ,mes.mes_StationStatusName as StationStatus
      ,met.met_EventDate as EventDate
--      ,oie.oie_EventDate
        ,met.met_ToothID
      ,met.met_Comment as metComment
      ,met.met_ManufacturingOrderNumber
--      ,ISNULL(mfi.mfi_OrderID,met.met_OrderID) as OrderID
        ,ord.ord_OrderReference as OrderRef


  FROM [dbo].[ManufacturingEvents] met
  LEFT JOIN [dbo].[ManufacturingEventOrderItems] mfi
      ON mfi.mfi_ManufacturingEventID = met.met_ManufacturingEventID
  LEFT JOIN [dbo].[OrderItems] ori
      ON ori.ori_OrderItemID = mfi.mfi_OrderItemID
  LEFT JOIN [AtlantisProductionSystem_Prod_US].[dbo].[Orders] ord
      ON ord.ord_OrderID = ISNULL(mfi.mfi_OrderID,met.met_OrderID)
  LEFT JOIN dbo.ManufacturingStations mes
      ON mes.mes_ManufacturingStationID = met.met_ManufacturingStationID
  JOIN dbo.ManufacturingOperations meo
      ON meo.meo_ManufacturingOperationID = mes.mes_ManufacturingOperationID
4

1 回答 1

1

试一试:

SELECT ot.orderRef, et.DateTS, et.EventName
FROM OrderTable ot
JOIN EventItemTable eit
  ON eit.OrderID = ot.OrderID
LEFT JOIN EventTable et
  ON et.OrderID = ot.OrderID

您可能仍需要对此进行调整,因为如果 EventTable OrderID 为空,则返回的信息可能无用。

您可以使用:

SELECT ot.orderRef, et.DateTS, ISNULL(et.EventName, eit.Column2)

或类似的东西。

我不确定 EventTable 和 EventItemTable 除了 OrderID 是否还有其他关系,但是如果我们可以在 EventID 上加入它们,您可以获得更好的结果:

SELECT ot.orderRef, et.DateTS, et.EventName
FROM EventTable et
JOIN EventItemTable eit
  ON et.EventID = eit.EventID
JOIN OrderTable ot
  ON eit.OrderID = ot.OrderID
于 2013-11-07T00:47:55.423 回答