[英]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.