2017-10-12 7 views
2

レコードが結合されていればそれを削除し、他のレコードの結合については考慮しません。これを1つの声明で行うことは可能ですか?SQL Server:Join/Cross Applyのレコードを一度だけ使用します

したがって、次の例では、最初のレコードでB.recordID = 2がすでに使用されているため、2番目のレコードに対してMatchID = 1を設定します。私は、サンプルコードは、それが明確になると信じて:彼らは試合として使用している場合

http://sqlfiddle.com/#!6/555a1/5/0

だから要約で私はもう利用可能考慮されるべきではない、テーブルBのレコードが必要です。

EDIT1:

CREATE TABLE A 
(
    id int, 
    eventName varchar(80), 
    startdateTime datetime, 
    duration int, 
    MatchedID int NULL 
) 

CREATE TABLE B 
(
    id int, 
    eventName varchar(80), 
    startdateTime datetime, 
    duration int 
) 

INSERT INTO A 
    SELECT 1, 'e1', dateadd(day, -1, getdate()), 5, NULL 
    UNION 
    SELECT 2, 'e1', dateadd(hour, -1, getdate()), 5, NULL 

INSERT INTO B 
    SELECT 1, 'e1', dateadd(day, -1, getdate()), 4 
    UNION 
    SELECT 2, 'e1', dateadd(hour, -1, getdate()), 5 

クエリ:

UPDATE toUpdate 
SET toUpdate.MatchedID = Tbtmp.id 
FROM A toUpdate 
CROSS APPLY (SELECT TOP(1) * 
      FROM B WHERE toUpdate.eventName = B.eventName 
      ORDER BY ABS(toUpdate.Duration - B.Duration)) Tbtmp; 

SELECT * FROM A 

結果:秒

| id | eventName |   startdateTime | duration | MatchedID | 
+----+-----------+--------------------------+----------+-----------+ 
| 1 |  e1 | 2017-10-11T11:34:15.083Z |  5 |   2 | 
| 2 |  e1 | 2017-10-12T10:34:15.083Z |  5 |   2 | 

期待される結果(MatchedID

スキーマを構築:サンプルコードを追加しますrec元のレコードに近いものの、すでに2が使用されているためordは1になるはずです)

| id | eventName |   startdateTime | duration | MatchedID | 
+----+-----------+--------------------------+----------+-----------+ 
| 1 |  e1 | 2017-10-11T11:34:15.083Z |  5 |   2 | 
| 2 |  e1 | 2017-10-12T10:34:15.083Z |  5 |   1 | 
+1

あなたの質問に、コードとサンプルデータを置く必要があります。問題は、理解されるべき外部サイトに頼るべきではない。 –

+0

期待どおりの結果?同様の詳細な説明も同様です。 –

+0

@AnkitBajpaiの予想結果が追加されました。 Thx – Asha

答えて

1

これを試してください。重複レコードを削除するには(eventName joinのため)、私は追加のCTEを使用します。私はあなたのサンプルデータでそれをテストし、それは動作しているようです。私はそれがあなたの実際のデータでもうまくいくことを願っています。

;WITH toUpdate AS 
(
    SELECT *, 
     RN_Update = ROW_NUMBER() OVER(PARTITION BY A.eventName ORDER BY A.id) 
    FROM A 
) 
, fromSource AS 
(
    SELECT B.*, 
     A.RN_Update, 
     RN_Source = ROW_NUMBER() OVER(PARTITION BY A.eventName, A.id ORDER BY A.id, ABS(A.Duration - B.Duration)) 
    FROM B 
     INNER JOIN toUpdate A ON A.eventName = B.eventName 
) 
UPDATE toUpdate 
SET 
    MatchedID = fromSource.id 
FROM toUpdate 
    INNER JOIN fromSource ON toUpdate.eventName = fromSource.eventName 
       AND toUpdate.RN_Update = fromSource.RN_Source 
       AND fromSource.RN_Update = fromSource.RN_Source 

結果:

id   eventName startdateTime   duration MatchedID 
----------- ----------- ----------------------- ----------- ----------- 
1   e1   2017-10-11 15:33:11.890 5   2 
2   e1   2017-10-12 14:33:11.890 5   1 
+0

残念なことに、このソリューションは私の実際のデータでは機能しませんでしたが、それはあなたのせいではなく、サンプルデータで動作すると言いましたので、これを答えとして受け入れるつもりです。ありがとう – Asha

関連する問題