1

単純な自己結合を試みていますが、出力が不安定です。

私のテーブル(入力)は次のようになります。

 ID  |   Value    
 1   |    val1   
 1   |    val2   
 1   |    val3  
 2   |    val4   
 2   |    val5   
 2   |    val6  
 2   |    val7

私が達成しようとしていることは次のとおりです。

 ID 1  |   Value 1  | ID 2  |   Value 2  
 1     |    val1    | 2     |   val4   
 1     |    val2    | 2     |   val5  
 1     |    val3    | 2     |   val6  
 Null  |    Null    | 2     |   val7  

この出力を達成するための私の試みは次のとおりです。

SELECT DISTINCT 
    column1.ID,
    column1.value,
    column2.ID,
    column2.value
FROM table column1   
INNER JOIN table column2 ON column1.ID = 1 AND column2.ID = 2    

このコードのチャンクは、間違った行数を返します。取得する必要がある行の総数は 4 で、最後に null 値がいくつかあります。null 値は取得されませんが、どのように取得されているかわからない数値が取得されます。さらに、テーブルからより多くのフィールドを表示することを選択すると、返される行数が増えます。この振る舞いがわかりません。誰かがそれを修正するのを手伝ってくれませんか? (そして、おそらく私が間違っていることを教えてください)。

4

2 に答える 2

2

これを効果的に行うことはできません。結合の左側と右側の行の間に関係はありません。結合には関係が必要です。ON条件は 2 つの関係を指定していないため、意図したよりも多くの行が表示されます。

SQL を使用してデータを表示用にフォーマットしようとしている場合は、しないでください。データを取得し、クライアント アプリケーションでフォーマットします。

于 2013-10-23T15:18:00.183 に答える
1

両方のデータ セットを異なる CTE またはサブクエリに分け、プロセスで ROW_NUMBER() 関数を使用して、値の順に行番号を割り当てます。最後に、行番号で 2 つを結合します。ただし、INNER 結合の代わりに FULL を使用すると、行が少ない側で null 値を取得できます。

WITH CTE_1 AS 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Value]) AS RN
    FROM dbo.table1
    WHERE ID = 1
)
, CTE_2 AS 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Value]) AS RN
    FROM dbo.table1
    WHERE ID = 2
)
SELECT 
    c1.ID AS ID1 
  , c1.VALUE AS Value1
  , c2.ID AS ID2
  , c2.VALUE AS Value2
FROM CTE_1 c1
FULL JOIN CTE_2 c2 ON c1.RN = c2.RN

SQLFIddle は現在動作していません。デモをセットアップすることはできませんが、使用したサンプル テーブルは次のとおりです。

CREATE TABLE Table1
    ([ID] int, [Value] varchar(4))
;

INSERT INTO Table1
    ([ID], [Value])
VALUES
    (1, 'val1'),
    (1, 'val2'),
    (1, 'val3'),
    (2, 'val4'),
    (2, 'val5'),
    (2, 'val6'),
    (2, 'val7')
;
于 2013-10-23T15:47:10.710 に答える