【问题标题】:Merge table of linked table contains value sql链接表的合并表包含值sql
【发布时间】:2017-01-03 16:06:17
【问题描述】:

我需要合并 a ,如下所示,但我只想在表 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 新手(第二天),如果这是一项我应该知道的简单任务,我很抱歉。

我希望你能帮助我。

【问题讨论】:

  • 如果您不使用 MySQL,那么您应该删除该标签。
  • 您在问题中使用/提到了不同的表格,然后是 Merge,然后是 select statements?您真正在使用哪些表,以及您到底想做什么? [dbo].[Delivery][ReportSvr].[Report].[dbo].[Delivery]dbo.Issue。还有dbo.Problemdbo.Issue 中的IsValid 列在哪里
  • 对不起,如果我没有说清楚。我必须合并两个表,如第一个片段所示,但我只想合并 [ReportSvr].[Report].[dbo].[Delivery] 中的行,其中 [ReportSvr].[Report 中的值 IsValid = 1 ].[dbo].[Issue] 这两个表通过 [Delivery].[IssueID] = [Issue].[ID] 链接。

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


【解决方案1】:

使用 INNER JOIN 将仅显示在问题表中具有匹配记录的交付。 INNER JOIN 只会显示在连接字段上有匹配项的记录。在您的尝试中,您正在使用 LEFT JOIN 它将显示左表中的所有内容,[Delivery](如果您在单行上显示整个查询,则“左”是有意义的)和右表中的匹配记录,[问题] .

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

【讨论】:

  • 您能否解释一下为什么您的解决方案应该有效?
  • 对不起,我忘了你是新手。您必须使用左连接将查询复制到某处。当你开始学习连接类型时,你可能会迷路,但老实说,我 99% 的查询都是 INNER 或 LEFT 连接,所以一旦你掌握了这些,你就会走得很远。此外,如果它只是说“JOIN”而没有修饰符,则默认情况下它是一个 INNER 连接,至少在 SQL Server 中是这样。
  • 感谢这部分工作:) 我如何将该代码片段应用到合并中,以便仅合并链接问题表中值为 IsValid = 1 的交付?
  • WHERE 子句已经为您解决了这个问题,但我不确定您要通过 MERGE 完成什么。当您尝试在具有复杂逻辑的许多不同字段上匹配两个表时,最好使用合并。这似乎是一个简单的 INSERT INTO - 您是否尝试将合并的值放入新表中?
【解决方案2】:

感谢您帮助我,在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2023-03-22
    • 1970-01-01
    • 2018-10-18
    • 2019-07-04
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多