2017-01-03 4 views
-1

以下のようにマージする必要がありますが、テーブルdbo.Problemの値がIsValidカラムに1の場合にのみ行います。 dbo.Problem.ID = dbo.Delivery.IssueIDによってdbo.Problemがdbo.deliveryにリンクされています。リンクテーブルのマージテーブルには値が含まれています


merge [dbo].[Delivery] as D 
using [ReportSvr].[Report].[dbo].[Delivery] as LinkD 

on (D.[ID] = LinkD.[ID]) 
    WHEN NOT MATCHED BY TARGET 
    THEN INSERT(
     [ID] 
     ,[IssueID] 
     ,[column2] 
     ,[column3] 
    ) 
    VALUES(
     [ID] 
     ,[IssueID] 
     ,[column] 
     ,[column] 
    ); 
GO 

ような何かをしようとしました。

select d.IssueID, i.IsValid 
From Delivery d 
left join (Select* From Issue where IsValid = 1) i 
on d.IssueID = i.ID 

第1ステップは必要な行にできる必要があるためです。

出力:

IssueID IsValid 
1  1 
2  NULL 
6  NULL 
7  1 
8  1 
9  1 
10  NULL 

私はひどく失敗した見たよう....

私は、これは簡単な作業であれば、私が知っておくべき、SQLへ(二日目)新しいごめんなさい約。

私があなたを助けてくれることを願っています。

+0

MySQLを使用していないなら、あなたはそのタグを削除する必要があります。 –

+0

あなたはあなたの質問で異なる表を使用してから、 'Merge'と' select statements'を使用しましたか?あなたは本当に何をしようとしていますか? '[dbo]。[Delivery]'、 '[ReportSvr]。[Report]。[dbo]。[Delivery]'、 'dbo.Issue'。 'dbo.Problem'や' dbo.Issue'の 'IsValid'カラムはどこにありますか –

+0

私は明確でない場合は申し訳ありません。 [ReportSvr]の行をマージしたいだけですが、[Report]。[dbo]。[ReportSvr]の値IsValid = 1の[Delivery]レポート]。[dbo]。[発行] 2つのテーブルは、[配達] [IssueID] = [Issue]。[ID]でリンクされています。 – Lauge

答えて

0

INNER JOINを使用すると、Issueテーブルに一致するレコードのみが表示されます。 INNER JOINは、結合フィールドに一致するレコードのみを表示します。あなたの試みではLEFT JOINを使用しています。左側のテーブルの[Delivery](すべてのクエリを1行に表示すると "left"は意味があります)と右側テーブルのレコードが一致しています。[Issue] 。

SELECT d.IssueID, i.IsValid 
FROM Delivery d 
    INNER JOIN Issue i 
     ON d.IssueID = i.ID 
WHERE i.IsValid = 1 
+0

あなたのソリューションが機能する理由についての説明を追加できますか? –

+0

申し訳ありませんが、あなたはこれを初めて知り忘れました。左側の結合でクエリをコピーしたはずです。ジョインタイプの学習を始めると失われる可能性がありますが、正直なところ私のクエリの99%はINNERまたはLEFTジョインなので、それらを取得すると遠くに行くでしょう。また、修飾子なしで "JOIN"と表示された場合、少なくともSQL ServerではINNER結合がデフォルトで行われます。 –

+0

ありがとうございます。 リンクされたIssueテーブルの値IsValid = 1のDeliveriesのみがマージされるように、そのスナップコードをマージにどのように適用しますか? – Lauge

0

私を助けてくれてありがとう、私はラッセルフォックスの助けを借りて問題を解決することができました。私はちょうど答えを投稿したかった。


merge [dbo].[Delivery] as D 

using(
    select d.*, i.IsValid 
    From [ErrorReportSvr].[ErrorReport].[dbo].[Delivery] d 
    inner join (Select* From [ErrorReportSvr].[ErrorReport].[dbo].[Issue] where IsValid = 1) i 
    on d.IssueID = i.ID 
) as LinkD 

on (D.[ID] = LinkD.[ID]) 
WHEN NOT MATCHED BY TARGET 
THEN INSERT(
    [ID] 
    ,[IssueID] 
    ,[column2] 
    ,[column3] 
) 
VALUES(
    [ID] 
    ,[IssueID] 
    ,[column2] 
    ,[column3] 
); 
GO 

関連する問題