簡體   English   中英

多列的SQL Join選擇語句

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM