0

私の状況では、2 つのテーブルがあります。それらを結合して、重複するレコードを同じ行に表示したいと考えています。以下に示すモックテーブル構造

MainTbl 列: MKey1、MKey2、MData1、MData2、MData3

SuppTbl 列: SPrimaryKey、SKey1、SKey2、SData1、SData2

MainTbl を SuppTbl に LEFT JOIN したい。ただし、SuppTbl には、SKey1 および SKey2 コンボ キーの重複が含まれています。

私が望む結果は以下のとおりです。「-#」は重複数を示します。

MKey1,MKey2,MData1,MData2,MData3,SData1-1,SData2-1,SData1-2,SData2-2

基本的に、結合のすべてのフィールドは、1 つの Key1 と Key2 に基づく 1 つの行に含まれている必要があります。

ショーン W による回答の試行

SELECT
    MainTbl.MKey1,
     MainTbl.MKey2,
    tcd.SData1 AS SData11,  
    tcd.SData2 AS SData22,
    tcr.SData1 AS SData12,  
    tcr.SData2 AS SData22
FROM MainTbl
LEFT JOIN SuppTbl tcd
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2
LEFT JOIN SuppTbl tcr
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2
WHERE tcd.SData1 < tcr.SData1

結果成功しません。レコードを取得しませんでした。

4

2 に答える 2

4

改訂(後のコメント):

CREATE TABLE MainTbl (MKey1 int,MKey2 int,MData1 varchar(10),MData2 varchar(10),MData3 varchar(10))
CREATE TABLE SuppTbl (SPrimaryKey int,SKey1 int,SKey2 int,SData1 varchar(10),SData2 varchar(10))

INSERT INTO MainTbl VALUES (1, 1, '1MData1', '1MData2', '1MData3')
INSERT INTO SuppTbl VALUES (1, 1, 1, '1SData1-1', '1SData2-1')
INSERT INTO SuppTbl VALUES (2, 1, 1, '1SData1-2', '1SData2-2')

INSERT INTO MainTbl VALUES (1, 2, '2MData1', '2MData2', '2MData3')
INSERT INTO SuppTbl VALUES (3, 1, 2, '2SData1-1', '2SData2-1')

SELECT
    MainTbl.MKey1,
    MainTbl.MKey2,
    tcd.SData1 AS SData11,  
    tcd.SData2 AS SData22,
    tcr.SData1 AS SData12,  
    tcr.SData2 AS SData22
FROM MainTbl
INNER JOIN SuppTbl tcd
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2
LEFT JOIN SuppTbl tcr
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2
AND tcd.SPrimaryKey < tcr.SPrimaryKey

これは、SuppTbl に 2 つの行があるインスタンスでは 100% 機能しません。2 つの結果行が得られます。1 つは問題なく、もう 1 つは除外します。これを除外するには、SuppTbl 行が 1 行を超えるインスタンスを特定する方法について、さらに情報を提供する必要があります。上記のコメント「WHERE Data1 = 4」で言及しました。したがって、これは WHERE 句の一部である必要があります。次のようになります。

 WHERE tcd.SData1 = 4

これにより、単一の SuppTbl 行が除外される場合があります。そのため、その行を除外しない方法に関する情報を提供する必要があります。多分:

 WHERE tcd.SData1 IN (4, 22)

(これは、上記の表のデータでは機能しません)。

于 2012-06-26T18:21:46.810 に答える
2

答えが見つかりました。簡単にするために少しトリミングしましたが、私の場合のように、適用できるWHERE条件がある限り、うまく機能します。

SELECT 
    MainTbl.MKey1,
    MainTbl.MKey2,
    tcd.stat AS SData11,
    tcr.stat AS SData12
FROM MainTbl
LEFT JOIN(
    SELECT * FROM SuppTbl WHERE SData1 <> 22
) tcd
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2
LEFT JOIN(
    SELECT * FROM SuppTbl WHERE SData1 = 22
) tcr
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2
于 2012-06-26T19:09:49.313 に答える