簡體   English   中英

將沒有重復(不同)的不同列加入/聯合到一個新表中

[英]Join/Union different columns without duplicates (Distinct) into a new table

嘗試了幾個小時,但無法找到有效的解決方案。 我正在使用 MariaDB。 我有一個包含數百萬行 (MySourceTable) 的表,我想在其中從特定列中獲取唯一的單元格值並將它們復制到新表中。

COL_A  COL_B  COL_C  COL_D  COL_E

  1      11     a      ab     a1  
  2      12     a      cd     a2  
  3      13     a      ab     a3  
  1      14     b      ab     a2  
  2      12     c      ef     a5  
  4      15     d      gh     a1

新的內容應該是這樣的:

COL_A   COL_B  COL_C  COL_D  COL_E

  1      11     a      ab     a1  
  2      12     b      cd     a2  
  3      13     c      ef     a3  
  4      14     d      gh     a5  
         15 

     

是的 - 加入后列不再有任何關系。 需要新目標表中此特定列的唯一行,以便隨后與DataTables SearchPanes 過濾器一起使用

編輯:是數據表搜索窗格期望過濾器值的方式。 如果我不將列值區分到一個新的唯一表中,searchPanes 必須在每個頁面刷新到幾十萬行,以獲取值。

到目前為止我嘗試過的:

DROP TABLE IF EXISTS col_names;
CREATE Table col_names 
(
    /*ID MEDIUMINT NOT NULL AUTO_INCREMENT, */
    ID MEDIUMINT NOT NULL Auto_Increment, 
    COL_A TINYTEXT, 
    COL_B TINYTEXT, 
    COL_C TINYTEXT, 
    COL_D TINYTEXT, 
    COL_E TINYTEXT
    PRIMARY KEY (ID)
);

INSERT INTO col_names (COL_A)
    Select Distinct Source_A AS COL_A FROM MySourceTable;
INSERT INTO col_names (COL_B)
    Select Distinct Source_B AS COL_B FROM MySourceTable;
INSERT INTO col_names (COL_C)
    Select Distinct Source_C AS COL_C FROM MySourceTable;
INSERT INTO col_names (COL_D)
    Select Distinct Source_D AS COL_D FROM MySourceTable;
INSERT INTO col_names (COL_E)
    Select Distinct Source_E AS COL_E FROM MySourceTable;

SELECT * FROM col_names
    ORDER BY COL_A, COL_B Desc; 

結果不是我所期望的。 我想,我必須使用 Cross Apply、Join、Union 等。嘗試過不同的事情,但失敗了很多次。

您可以使用row_number()union all和聚合來做到這一點:

select max(col_a), max(col_b), . . .
from ((select row_number() over (order by col_a) as seqnum,
              col_a, null as col_b, null as col_c, null as col_d, null as col_e
       from t
       group by col_a
      ) union all
      (select row_number() over (order by col_b) as seqnum,
              null as col_a, col_b, null as col_c, null as col_d, null as col_e
       from t
       group by col_b
      ) union all
      . . .
     ) x
group by seqnum;

將您的要求更改為標准化輸出; 兩列 - column_name 和 column_value。 然后,預期結果中的每個單元格都成為規范化結構中的一行。 這更符合 sql,更靈活,如果一列的值比其余列多得多,則不會有奇怪的行為,等等。

SELECT
  DISTINCT
  lookup.*
FROM
  MySourceTable
CROSS APPLY
(
  SELECT 'COL_A', MySourceTable.Source_A
  UNION ALL
  SELECT 'COL_B', MySourceTable.Source_B
  UNION ALL
  etc, etc
)
  AS lookup(column_name, column_value)

也許...

SELECT DISTINCT 'COL_A' AS column_name, Source_A AS column_value FROM MySourceTable
UNION ALL
SELECT DISTINCT 'COL_B' AS column_name, Source_B AS column_value FROM MySourceTable
UNION ALL
etc, etc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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