簡體   English   中英

不同列的不同值

[英]distinct values of different columns

我不確定是否有可能。

我有一個包含3列的表格,並且我想獲得每個表格的不同值,有一個示例:

A      B        C
--------------------
a1     b1       c1
a1     b2       c2
a1     b3       c1 

預期結果是:

A      B       C
-----------------
a1     b1      c1
       b2      c2
       b3

因此,它將是以下內容的並集:

SELECT DISTINCT A FROM myTable
SELECT DISTINCT B FROM myTable
SELECT DISTINCT C FROM myTable

使用UNION,我在一列中得到結果。

這可行嗎?

請嘗試以下...

SELECT COALESCE( a, '' ) AS a,
       COALESCE( b, '' ) AS b,
       COALESCE( c, '' ) AS c
FROM ( SELECT a,
              ROW_NUMBER() OVER ( ORDER BY a ) AS recordNumber
       FROM ( SELECT a
              FROM myTable
              GROUP BY a
            ) aFinder
     ) aNumberedFinder
FULL JOIN ( SELECT b,
                   ROW_NUMBER() OVER ( ORDER BY b ) AS recordNumber
            FROM ( SELECT b
                   FROM myTable
                   GROUP BY b
                 ) bFinder
          ) bNumberedFinder ON bNumberedFinder.recordNumber = aNumberedFinder.recordNumber
FULL JOIN ( SELECT c,
                   ROW_NUMBER() OVER ( ORDER BY c ) AS recordNumber
            FROM ( SELECT c
                   FROM myTable
                   GROUP BY c
                 ) cFinder
          ) cNumberedFinder ON cNumberedFinder.recordNumber = aNumberedFinder.recordNumber
                            OR cNumberedFinder.recordNumber = bNumberedFinder.recordNumber;

該語句以以下子查詢開頭...

SELECT a
FROM myTable
GROUP BY a

此子查詢在字段a生成唯一值的列表。 以下子查詢使用記錄(又稱行)編號重現此列表...

SELECT a,
       ROW_NUMBER() OVER ( ORDER BY a ) AS recordNumber
FROM ( SELECT a
       FROM myTable
       GROUP BY a
     ) aFinder

類似的子查詢用於在字段bc生成唯一值的編號列表。

然后在ab的列表之間執行FULL OUTER JOIN (在此縮寫為FULL JOIN ),並將它們的記錄號用作公用/ FULL JOIN值。

注意: INNER JOIN只返回與兩個較短列表中的記錄一樣多的記錄。 僅當JOIN左側的列表的長度大於或大於右側列表的長度時, LEFT JOIN才有效。 類似的邏輯適用於RIGHT JOIN的用法。 FULL JOIN將以LEFT JOINRIGHT JOIN的方式FULL JOIN兩個列表,而不管哪個列表更長。

然后,在上述連接的數據集和c的列表之間執行FULL JOIN ,在其中的任意一個列表中找到一個公共值。

然后從最終聯接的數據集中選擇abc的值,其中COALESCE()函數用空字符串( '' )替換任何NULL值(例如由聯接過程生成的值)的出現

如果您有任何問題或意見,請隨時發表評論。

附錄

我的語句已針對使用以下腳本創建的數據庫進行了測試...

CREATE TABLE myTable
(
    a   VARCHAR( 5 ),
    b   VARCHAR( 5 ),
    c   VARCHAR( 5 )
);
INSERT INTO myTable ( a,
                      b,
                      c
                    )
VALUES ( 'a1', 'b1', 'c1' ),
       ( 'a1', 'b2', 'c2' ),
       ( 'a1', 'b3', 'c1' );

進一步閱讀

https://docs.microsoft.com/zh-cn/sql/t-sql/language-elements/coalesce-transact-sql (在Transact-SQL中使用COALESCE()函數)

https://www.w3schools.com/sql/sql_join.asp (關於各種類型的水平JOIN維恩圖很有用)

https://technet.microsoft.com/zh-cn/library/ms187518(v = OUTER JOIN在SQL Server中使用OUTER JOIN

https://docs.microsoft.com/zh-cn/sql/t-sql/functions/row-number-transact-sql (在Transact-SQL中使用ROW_NUMBER()時)

暫無
暫無

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

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