【问题标题】:Joining multiple select sql statements (4 tables)加入多个select sql语句(4个表)
【发布时间】:2016-12-21 13:42:01
【问题描述】:

我需要将 2 个 SQL 语句连接在一起,并且这两个语句都可以独立运行。但我不知道如何将两者组合成 1 个 SQL 语句。

我在第一条语句中有两个表,TR120TR1201

SQL 是这样的:

select 
    PRODUCT, PRICE, QUANTITY, INVOICE.DATE 
from 
    TR1201
left join 
    (select 
         DATE, ID as INVOICE_ID, INVOICE 
     from TR120) as INVOICE on INVOICE.INVOICE_ID = ID 
where 
    INVOICE.DATE >= '2016-06-01' and INVOICE.DATE <= '2016-06-30'

这将返回我售出的所有产品的列表,包括价格、数量和销售日期,具体时间范围为 16 年 1 月 6 日至 2016 年 6 月 30 日。

现在我需要根据第一条 SQL 语句中的产品和销售日期,在不同的两个表 TR100TR1001 中找出我购买产品的最新价格。

select 
    PRODUCT, PRICE, SUP.DATE  
from 
    TR1001 
left join 
    (select 
         DATE, ID as SUP_ID, SUP_INVOICE 
     from TR100) as SUP on SUP.SUP_ID = ID

这将返回我购买的所有产品的列表,其中包含价格和日期。我只需要基于产品和购买日期的查询的最后一条记录。

TR120

ID | INVOICE | DATE
1  | 000001  |2016-06-05
2  | 000002  |2016-06-15
3  | 000003  |2016-06-25

TR1201

ID | PRODUCT | PRICE A | QUANTITY
1  | A       | 2,00    |    5
2  | A       | 2,00    |    2
3  | A       | 2,00    |    1

TR100

ID | SUP_INVOICE | DATE
1  | 160001      | 2016-05-30
2  | 160002      | 2016-06-16

TR1001

ID | PRODUCT | PRICE B
1  | A       | 0,5
2  | A       | 0,7

我想要得到的结果是这样的:

PRODUCT | PRICE A (tr1201) | QUANTITY | DATE (tr100) | PRICE B (tr1001)
A       | 2                |  5       | 2016-05-30   |   0,5
A       | 2                |  2       | 2016-05-15   |   0,5
A       | 2                |  1       | 2016-05-16   |   0,7

这就是我想做的一切:(

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你试过 first_value 吗?

    FIRST_VALUE ( [scalar_expression ] )   
        OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )  
    

    它是这样工作的:

      select distinct id, 
             first_value(price) over (partition by id (,sup) order by date DESC (latest, ASC for oldest)) as last_price
     from table;
    

    文档可以在这里找到:https://msdn.microsoft.com/en-us/library/hh213018.aspx

    【讨论】:

    • 也谢谢你!!!我将尝试这两个示例并报告结果。
    【解决方案2】:

    我没有您的表格,因此无法测试,因此仅提供建议。 我认为您需要的是像这样的外部应用而不是连接

    select 
          T1.Product
        , T1.Price
        , T2.DATE   -- Alias this
        , T2.Price  -- Alias this
        , T3.DATE   -- Alias this
        , T3.Price  -- Alias this
    from T1
    OUTER APPLY (
        select top 1
              Date
             ,Price
        from table2
        WHERE ID = T1.Id AND product = T1.Product-- plus any other joins
        ORDER BY Date desc
    ) as T2 
    OUTER APPLY (
        select top 1 
              Date
             ,Price
        from table3
        WHERE ID = T1.Id AND product = T1.Product-- plus any other joins
        ORDER BY Date desc
    ) as T3 
    

    【讨论】:

    • 谢谢。我会试试看!
    • 对不起,HEKi。我错了。我使用 SQL Server 并错过了您帖子中的 MySQL 标签。 MySQL 不支持 CROSS APPLY 我试图提供帮助,但很抱歉我可能让你误入歧途。
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2013-06-11
    • 2018-02-16
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多