繁体   English   中英

检索SQL Server中的父子记录

[英]Retrieve parent child records in SQL Server

我有两个表“ Trade和“ Trade Details如下所示:

交易表:

ID    Portfolio   Source   Version     Createdon   Status
---------------------------------------------------------
1     Test1       RIM      1.0         2016-01-20    1
2     Test2       iOS      1.0         2016-01-20    1

交易明细表

ID   TradeID    Ticker   Company     Shares     Action  Comments
----------------------------------------------------------------
1      1        MSFT     Microsoft     100        Buy      Test
2      1        IBM      IBM           200        Sell     Test
3      2        Yahoo    Yahoo Inc     50         Sell     Test
4      2        Goog     Google Inc    500        Buy      Test

我想检索并以以下格式显示数据。

产量

1     Test1       RIM      1.0         2016-01-20    1
1      1        MSFT     Microsoft     100        Buy      Test
2      1        IBM      IBM           200        Sell     Test
2     Test2       iOS      1.0         2016-01-20    1
3      2        Yahoo    Yahoo Inc     50         Sell     Test
4      2        Goog     Google Inc    500        Buy      Test     

您将需要在两个表之间使用联合,并添加自定义的其他列,以设置所需的顺序以生成所需的输出

ex [使用oracle语法,但是思想是相同的]

    SELECT 
        CASE WHEN OID = 0 THEN TO_CHAR(P_TradeID) ELSE Portfolio END AS TradeID, Portfolio, Ticker, Company,SHARES, Action, Comments
    FROM
    (
        SELECT
            ID AS OID, 1 AS SOID,
            TradeID AS P_TradeID,
            TO_CHAR(ID) AS Portfolio, -- important to change to datatype of columns to be matching in the union in order for the union statement to work
            Ticker,
            Company,
            TO_CHAR(SHARES) SHARES,
            TO_CHAR(Action) Action,
            Comments
        FROM
        (
            --here will be your select statement.... the below is just a demo
            SELECT 1 AS ID, 1 AS TradeID, 'MSFT'  AS Ticker, 'Microsoft'  AS Company, 100 AS SHARES, 'Buy'  AS Action, 'Test' AS Comments FROM DUAL UNION
            SELECT 2 AS ID, 1 AS TradeID, 'IBM'   AS Ticker, 'IBM'        AS Company, 200 AS SHARES, 'Sell' AS Action, 'Test' AS Comments FROM DUAL UNION
            SELECT 3 AS ID, 2 AS TradeID, 'Yahoo' AS Ticker, 'Yahoo Inc'  AS Company, 50  AS SHARES, 'Sell' AS Action, 'Test' AS Comments FROM DUAL UNION
            SELECT 4 AS ID, 2 AS TradeID, 'Goog'  AS Ticker, 'Google Inc' AS Company, 500 AS SHARES, 'Buy'  AS Action, 'Test' AS Comments FROM DUAL
        )

        UNION --the trick is with the union here

        SELECT
            0 AS OID,0 AS SOID, --and the order columns here and in the above query
            ID AS P_TradeID,
            Portfolio,
            Source AS Ticker,
            Version AS Company,
            TO_CHAR(Createdon) AS SHARES,
            TO_CHAR(Status) AS Action,
            '' AS Comments
        FROM
        (
            --and again, make sure the datatype of the columns are the same!
            SELECT 1 AS ID, 'Test1' AS Portfolio, 'RIM' Source, '1.0' AS Version, '2016-01-20' AS Createdon, 1 AS Status  FROM DUAL UNION
            SELECT 2 AS ID, 'Test2' AS Portfolio, 'iOS' Source, '1.0' AS Version, '2016-01-20' AS Createdon, 1 AS Status  FROM DUAL
        )
    )
    ORDER BY 
        P_TradeId, SOID, OID

这将生成以下内容:

1 | Test1   | RIM   |   1.0         | 2016-01-20 |  1       | 
1 | 1       | MSFT  |   Microsoft   | 100        |  Buy     | Test
2 | 2       | IBM   |   IBM         | 200        |  Sell    | Test
2 | Test2   | iOS   |   1.0         | 2016-01-20 |  1       | 
3 | 3       | Yahoo |   Yahoo Inc   | 50         |  Sell    | Test
4 | 4       | Goog  |   Google Inc  | 500        |  Buy     | Test

请参阅此SQL Fiddle链接以获取sql-server-2008语法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM