【问题标题】:Returning ID's from two other tables or null if no IDs found using using a left join SQL Server从其他两个表返回 ID,如果使用左连接 SQL Server 找不到 ID,则返回 null
【发布时间】:2017-04-08 02:31:33
【问题描述】:

我想知道是否有人可以帮助我。我正在尝试在两个表上进行连接并返回一个 id 如果有一个 id 但如果没有 id 返回 null 但仍返回该产品的行而不忽略它。我下面的查询返回的记录数量是我无法弄清楚原因的两倍。

SELECT 
    T2.ProductID, FirstChild.SupplierID, SecondChild.AccountID
FROM 
    Products T2
LEFT OUTER JOIN
    (
    SELECT TOP(1) SupplierID, Reference,CompanyID, Row_Number() OVER (Partition By SupplierID Order By SupplierID) AS RowNo FROM Suppliers
    ) 
    FirstChild ON T2.SupplierReference = FirstChild.Reference AND RowNo = 1AND FirstChild.CompanyID =T2.CompanyID

LEFT OUTER JOIN
    (
    SELECT TOP(1)  AccountID, SageKey,CompanyID, Row_Number() OVER (Partition By AccountID Order By AccountID) AS RowNo2 FROM Accounts
    ) 
    SecondChild ON T2.ProductAccountReference = SecondChild.Reference AND RowNo2 = 1 AND SecondChild.CompanyID =T2.CompanyID

我正在尝试做的示例

ProductID     SupplierID   AccountID
   1             5           2
   2             6           NULL
   3             NULL        NULL

【问题讨论】:

  • 我认为样本数据和期望的结果确实有助于解释您想要做什么。
  • 我更新了问题以显示我想要得到的输出,希望它更有意义
  • SELECT DISTINCT 也许?

标签: sql sql-server select left-join


【解决方案1】:

如果只是显示重复记录,那么在选择行中添加 distinct 不是一个不雅的解决方案吗?

【讨论】:

    【解决方案2】:

    OUTER APPLY 并放弃 ROW_NUMBER 似乎是一个更好的选择:

    SELECT
        p.ProductId
        ,FirstChild.SupplierId
        ,SecondChild.AccountId
    FROM
        Products p
        OUTER APPLY (SELECT TOP (1) s.SupplierId
                 FROM
                    Suppliers s
                 WHERE
                    p.SupplierReference = s.SupplierReference
                    AND p.CompanyId = s.CompanyId
                 ORDER BY
                    s.SupplierId
                 ) FirstChild
        OUTER APPLY (SELECT TOP (1) a.AccountId
                 FROM
                    Accounts
                 WHERE
                    p.ProductAccountReference = a.Reference
                    AND p.CompanyId = a.CompanyId
                 ORDER BY
                    a.AccountID
                 ) SecondChild
    

    您的查询在上面编写的方式与派生表没有关联。这意味着您将始终获得基于优化的 SupplierId SQL 选择的内容,如果这并不总是 Row1,您将无法获得该值。您需要关联您的 Table 并选择 top 1,在派生表中添加 ORDER BY 就像识别您想要的行号。

    【讨论】:

    • 谢谢你的帮助,很优雅,有很好的解释。
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多