0

table_One複数columns(Column1, Column2, Column3, Column4.....) の両方の参照 ( Contains PK values for Table_two) を別のテーブルに持つテーブルがありますTable_Two。Table_one を table_Two に複数回結合するのではなく、これら 2 つのテーブルを結合する効率的な方法はありますか?br/>

2 つのテーブルと目的の結果セットの構造は次のとおりです。テーブル_1

ここに画像の説明を入力

4

3 に答える 3

2

以下のように、table2 テーブルのエイリアスを作成し、それを Table_One に 2 回結合してみましたか?

SELECT
    t1.PrimaryKey,
    c1.ColumnA AS Column1,
    c2.ColumnA AS Column2
FROM Table_One t1
JOIN Table_two c1 ON t1.Column1 = c1.ID
JOIN Table_two c2 ON t1.Column2 = c2.ID;
于 2013-10-17T20:02:11.157 に答える
1

次のソリューション ( SQLFiddle ) は、2 番目のテーブルから行を 1 回だけ読み取ります。

SET STATISTICS IO ON;
...
PRINT 'Test #1'
SELECT  *
FROM
(
    SELECT  ca.PrimaryKey, ca.[Type], y.ColumnA
    FROM    @Table1 x
    UNPIVOT( Value FOR [Type] IN ([Column1], [Column2]) ) ca
    INNER MERGE /*HASH*/ JOIN @Table2 y ON ca.Value = y.ID
) src
PIVOT( MAX(src.ColumnA) FOR src.[Type] IN ([Column1], [Column2]) ) pvt
PRINT 'End of Test #1'

結果:

Test #1
PrimaryKey Column1   Column2
---------- --------- -------
1          ALPHA     CHARLIE
2          BETA      DELTA
3          CHARLIE   ALPHA
4          DELTA     CHARLIE
5          ALPHA     DELTA
6          CHARLIE   ALPHA
7          ALPHA     DELTA
8          DELTA     CHARLIE

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#65B6F546'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#61E66462'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

End of Test #1
于 2013-10-17T20:56:20.760 に答える
1
Select Table_One.PrimaryKey,
       T2_Column1.ColumnA As Column1,
       T2_Column2.ColumnA As Column2
From   Table_One
       Inner Join Table_Two As T2_Column1
         On Table_One.Column1 = T2_Column1.ID
       Inner Join Table_Two As T2_Column2
         On Table_One.Column2 = T2_Column2.Id

基本的に、テーブル 2 に 2 回参加します。これを行う場合、SQL が混乱しないように、少なくとも 1 つのエイリアスを作成する必要があります。練習問題として、6 か月後にこのコードをもう一度読んだときに理解しやすいように、通常は両方にエイリアスを付けるのが最善です。

于 2013-10-17T19:59:59.617 に答える