链表的合并表包含值sql

时间:2017-01-03 16:06:18

标签: sql-server sql-server-2008 merge

我需要合并一个如下所示,但如果表dbo.Problem在IsValid列中的值为1,我只想这样做。 dbo.Problem通过dbo.Problem.ID = dbo.Delivery.IssueID链接到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

因为第一步必须是能够想要的行。

输出:

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

如你所见,我失败了......

我是新的(第二天)SQL,对不起,如果这是一个我应该知道的简单任务。

我希望你能帮助我。

2 个答案:

答案 0 :(得分:0)

使用INNER JOIN仅显示Issue表中具有匹配记录的交货。 INNER JOIN仅显示连接字段匹配的记录。在您的尝试中,您将使用LEFT JOIN,它将显示左表中的所有内容,[Delivery](" left"如果您在一行上显示整个查询,则有意义)和匹配的记录右表,[问题]。

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

答案 1 :(得分:0)

感谢您帮助我,我设法在Russell Fox的帮助下解决了这个问题。我只想发布答案。

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