【问题标题】:Combine Multiple Tables using LEFT JOIN and UNION使用 LEFT JOIN 和 UNION 组合多个表
【发布时间】:2016-07-16 19:03:05
【问题描述】:

我有 5 个不同的表格 来获取数据。但首先我使用 3 个表进行测试。使用 LEFT JOINUNION。到目前为止,这是我一直在使用的代码。

SELECT sts.TransferDate as 'Transaction Date', sts.TransNumber as 'Document Number', orderset_details.Quantity as 'Quantity', '' as 'Po Number', '' as 'Sales Invoice', orderset_details.Cost as 'Cost', orderset_details.SerialNumber as 'Serial Number', orderset_details.LotNumber as 'Lot Number', location.Location as 'Location' 
FROM orderset_details 
LEFT JOIN sts ON sts.OrdersetId = orderset_details.OrdersetId
LEFT JOIN location ON location.LocationId = sts.LocationIdTo  
WHERE orderset_details.ItemId = '3071' 
UNION 
SELECT drs.OrderDate as 'Transaction Date', drs.TransNumber as 'Document Number', orderset_details.Quantity, drs.PONumber as 'Po Number', '' as 'Sales Invoice', orderset_details.Cost as 'Cost', orderset_details.SerialNumber as 'Serial Number', orderset_details.LotNumber as 'Lot Number', suppliers.Supplier as 'Location' 
FROM orderset_details 
LEFT JOIN drs ON drs.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN suppliers ON suppliers.SupplierId = drs.SupplierId 
WHERE orderset_details.ItemId = '3071'
UNION 
SELECT stockadjustment.TransactionDate as 'Transaction Date', stockadjustment.TransactionId as 'Document Number', orderset_details.Quantity as 'Quantity', '' as 'Po Number', '' as 'Sales Invoice', orderset_details.Cost as 'Cost', orderset_details.SerialNumber as 'Serial Number', orderset_details.LotNumber as 'Lot Number', location.Location as 'Location' 
FROM orderset_details 
LEFT JOIN stockadjustment ON stockadjustment.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN location ON location.LocationId = stockadjustment.LocationId 
WHERE orderset_details.ItemId = '3071' 
Group By orderset_details.ItemId

这是输出。

输出应该只有 1 并且是最后一行。我的问题是,当我的 1 或 2 个查询没有任何意义时,它会重复一些不正确的列。

如何只显示与特定 ItemId 相等的数据?我的查询有什么问题?

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    在您的查询中,您应该只在第一个选择中使用别名,并且您没有聚合功能,因此您不需要 group by .. 因为 unio 只返回不同的结果

    SELECT 
        sts.TransferDate as 'Transaction Date'
      , sts.TransNumber as 'Document Number'
      , orderset_details.Quantity as 'Quantity'
      , '' as 'Po Number'
      , '' as 'Sales Invoice'
      , orderset_details.Cost as 'Cost'
      , orderset_details.SerialNumber as 'Serial Number'
      , orderset_details.LotNumber as 'Lot Number'
      , location.Location as 'Location' 
    FROM orderset_details 
    LEFT JOIN sts ON sts.OrdersetId = orderset_details.OrdersetId
    LEFT JOIN location ON location.LocationId = sts.LocationIdTo  
    WHERE orderset_details.ItemId = '3071' 
    UNION 
    SELECT 
          drs.OrderDate 
        , drs.TransNumber 
        , orderset_details.Quantity
        , drs.PONumber 
        , ''
        , orderset_details.Cost 
        , orderset_details.SerialNumber 
        , orderset_details.LotNumber 
        , suppliers.Supplier 
    FROM orderset_details 
    LEFT JOIN drs ON drs.OrdersetId = orderset_details.OrdersetId 
    LEFT JOIN suppliers ON suppliers.SupplierId = drs.SupplierId 
    WHERE orderset_details.ItemId = '3071'
    UNION 
    SELECT 
          stockadjustment.TransactionDate 
        , stockadjustment.TransactionId 
        , orderset_details.Quantity 
        , '' 
        , '' 
        , orderset_details.Cost 
        , orderset_details.SerialNumber 
        , orderset_details.LotNumber 
        , location.Location     
    FROM orderset_details 
    LEFT JOIN stockadjustment ON stockadjustment.OrdersetId = orderset_details.OrdersetId 
    LEFT JOIN location ON location.LocationId = stockadjustment.LocationId 
    WHERE orderset_details.ItemId = '3071' 
    

    【讨论】:

    • 它仍然是相同的输出:(
    • 一一检查选择..并检查不同的结果是否正确..以及为什么需要3个选择的联合来仅选择一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2018-11-09
    • 2018-02-28
    相关资源
    最近更新 更多