[英]SQL Join select statements for multiple columns
我正在使用TOAD 9.7在oracle數據庫中工作。
我有三個表,我正在從中選擇數據。 這三個表共享唯一的ID,稱為GID。
我想從滿足特定條件的所有三個表中選擇數據,然后加入select語句,以便有多個列,而不是具有相同唯一ID的多個行。 但是,我不想簡單地加入多個選擇語句。 我相信我正在尋找的是交叉表查詢,因為每個唯一的ID我只希望一行,每個ntype和atype都有列標題
這是第一個表中數據的示例,我們將其稱為Table_G。
+----------+-------+--------+ | GID | METHN | TEAMID | +----------+-------+--------+ | -1534063 | 60 | 3070 | | -1534064 | 60 | 3070 | | -1534065 | 60 | 3070 | | -1534061 | 60 | 3069 | | -1534062 | 60 | 3069 | | -1534060 | 60 | 3069 | +----------+-------+--------+
這是第二個表的示例,我們將其稱為Table_N
+----------+-------+------------+--------+ | GID | NTYPE | NVAL | TEAMID | +----------+-------+------------+--------+ | -1534064 | 61 | 102-1095-1 | 3070 | | -1534064 | 18 | 1868 | 3070 | | -1534064 | 5 | 659 | 3070 | | -1520001 | 61 | 103-1040-1 | 3070 | | -1520001 | 18 | 4285 | 3070 | | -1520002 | 61 | 103-1040-2 | 3070 | +----------+-------+------------+--------+
最后是第三個表,它與第二個表非常相似,但是使用atype和aval而不是ntype和nval -我們將其稱為Table_A
+----------+-------+--------------------------+--------+ | GID | ATYPE | AVAL | TEAMID | +----------+-------+--------------------------+--------+ | -1534065 | 114 | IYSV Trial EC Selections | 3070 | | -1534065 | 108 | White Inbreds | 3070 | | -1534065 | 107 | 400 | 3070 | | -1534064 | 114 | IYSV Trial EC Selections | 3070 | | -1534064 | 108 | White Inbreds | 3070 | | -1534064 | 107 | 400 | 3070 | +----------+-------+--------------------------+--------+
我希望每個GID僅包含一行,每個適用的ntype和atype都有一列,其中methn = 60(表中methn的其他值)和teamid =3070。結果將是類似下面:
+----------+-------+---------+----------+------------+-----------+---------------+--------------------------+ | GID | METHN | NTYPE_5 | NTYPE_18 | NTYPE_61 | ATYPE_107 | ATYPE_108 | ATYPE_114 | +----------+-------+---------+----------+------------+-----------+---------------+--------------------------+ | -1534064 | 60 | 659 | 1868 | 102-1095-1 | 400 | White Inbreds | IYSV Trial EC Selections | +----------+-------+---------+----------+------------+-----------+---------------+--------------------------+
誰能幫助我為該數據設計一個交叉表查詢(或任何可以給我所需結果的東西)?
您可以使用手工連接語句來完成此任務,與樞軸相比,我總是發現使用它比使用樞軸更容易-它在功能上是相同的。 對於您的示例,它看起來像這樣:
SELECT G.GID, G.METHIN,
NT_5.NVAL AS NTYPE_5,
NT_18.NVAL AS NTYPE_18,
NT_61.NVAL AS NTYPE_61,
AT_107.NVAL AS ATYPE_107,
AT_108.NVAL AS ATYPE_108,
AT_114.NVAL AS ATYPE_114
FROM Table_G as G
LEFT JOIN Table_N AS NT_5 ON G.GID = NT_5.GID AND NT_5.NTYPE = 5
LEFT JOIN Table_N AS NT_18 ON G.GID = NT_18.GID AND NT_18.NTYPE = 18
LEFT JOIN Table_N AS NT_61 ON G.GID = NT_61.GID AND NT_61.NTYPE = 61
LEFT JOIN Table_A AS AT_107 ON G.GID = AT_107.GID AND AT_107.NTYPE = 107
LEFT JOIN Table_A AS AT_108 ON G.GID = AT_108.GID AND AT_108.NTYPE = 108
LEFT JOIN Table_A AS AT_114 ON G.GID = AT_114.GID AND AT_114.NTYPE = 114
使用數據透視,可以實現這一點,但是您需要牢記xQbert提出的那些觀點。
WITH g_table(GID, METHN, TEAMID) AS
(SELECT 1534063, 60, 3070 FROM dual UNION ALL
select 1534064 , 60 , 3070 FROM dual UNION ALL
select 1534065 , 60 , 3070 FROM dual UNION ALL
select 1534061 , 60 , 3069 FROM dual UNION ALL
select 1534062 , 60 , 3069 FROM dual UNION ALL
select 1534060 , 60 , 3069 FROM dual),
n_table(GID, NTYPE, NVAL, TEAMID) AS (
select 1534064 , 61 , 102-1095-1 , 3070 from dual UNION ALL
select 1534064 , 18 , 1868 , 3070 from dual UNION ALL
select 1534064 , 5 , 659 , 3070 from dual UNION ALL
select 1520001 , 61 , 103-1040-1 , 3070 from dual UNION ALL
select 1520001 , 18 , 4285 , 3070 from dual UNION ALL
select 1520002 , 61 , 103-1040-2 , 3070 from dual),
a_table(GID, ATYPE, AVAL, TEAMID) AS (
select 1534065 , 114 , 'IYSV Trial EC Selections' , 3070 from dual UNION ALL
select 1534065 , 108 , 'White Inbreds' , 3070 from dual UNION ALL
select 1534065 , 107 , '400' , 3070 from dual UNION ALL
select 1534064 , 114 , 'IYSV Trial EC Selections' , 3070 from dual UNION ALL
select 1534064 , 108 , 'White Inbreds' , 3070 from dual UNION ALL
select 1534064 , 107 , '400' , 3070 from dual),
--------------------------
-- End of Data preparation
--------------------------
gn_table AS (
SELECT g.gid, g.methn, n.nval, n.ntype
FROM g_table g
JOIN n_table n ON n.gid = g.gid),
gn_pivot AS (
select * FROM gn_table
PIVOT (MIN(nval) AS nval FOR ntype IN (61, 18, 5))),
agn_table AS (
SELECT a.gid, a.aval, a.atype, gn.methn, gn."61_NVAL", gn."18_NVAL",gn."5_NVAL"
FROM a_table a JOIN gn_pivot gn ON gn.gid = a.gid)
select *
FROM agn_table
PIVOT (MIN(aval) aval FOR atype IN (107, 108, 114));
輸出:
GID METHN 61_NVAL 18_NVAL 5_NVAL 107_AVAL 108_AVAL 114_AVAL
-----------------------------------------------------------------------------
1534064 60 -994 1868 659 400 White Inbreds IYSV Trial EC Selections
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.