【问题标题】:SQL Server 2008 Preserve rows from table with non-matching values from another tableSQL Server 2008 保留表中的行与另一个表中的不匹配值
【发布时间】:2017-01-25 14:16:57
【问题描述】:

假设我有 2 张桌子:

FRUITS           RECIPE
-----------      -----------------
id  name         ver   id1     id2
-----------      -----------------
1   apple        1     1       1
2   banana       2     null    3
3   orange       3     3       3
4   peach        4     4       2
                 5     1       null
                 6     null    null

为了返回 id1 和 id2 值的名称,我尝试过:

SELECT ver, id1, F1.name, id2, F2.name
FROM RECIPE INNER JOIN FRUITS AS F1 ON id1 = F1.name
            INNER JOIN FRUITS AS F2 ON id2 = F2.name

返回:

------------------------------------
ver   id1     name       id2    name
------------------------------------
1     1       apple      1      apple 
3     3       orange     3      orange
4     4       peach      2      banana

我希望结果集包括所有 RECIPE 行,包括空值,如下所示:

------------------------------------
ver   id1     name      id2     name
------------------------------------
1     1       apple     1       apple 
2     null    null      3       orange
3     3       orange    3       orange
4     4       peach     2       banana
5     1       apple     null    null
6     null    null      null    null

感谢您的帮助...

【问题讨论】:

  • 使用 LEFT JOIN 而不是 INNER JOIN。
  • @KamilG。哇!好人……我错过了。非常感谢。谢谢。

标签: sql sql-server-2008 join null


【解决方案1】:

用户外部加入喜欢-

SELECT ver, id1, F1.name, id2, F2.name
FROM RECIPE 
LEFT JOIN FRUITS F1 
ON id1 = F1.id
LEFT JOIN FRUITS F2 
ON id2 = F2.id

在您的查询中,您将 id 与 fruits'name 进行比较,这是错误的。

【讨论】:

    【解决方案2】:

    使用 LEFT JOIN 而不是 INNER JOIN 来保留由RECIPE 表生成的整个输出以及从FRUITS 检索到的附加信息:

    SELECT ver, id1, F1.name, id2, F2.name
    FROM RECIPE 
    LEFT JOIN FRUITS AS F1 ON id1 = F1.name
    LEFT JOIN FRUITS AS F2 ON id2 = F2.name
    

    Quote

    LEFT JOIN 关键字返回左表 (table1) 中的所有行,以及右表 (table2) 中的匹配行。不匹配时,右侧结果为NULL。

    【讨论】:

      【解决方案3】:

      你需要使用外连接,例如

      SELECT ver, id1, F1.name, id2, F2.name
      FROM RECIPE LEFT OUTER JOIN FRUITS AS F1 ON id1 = F1.name
                  LEFT OUTER FRUITS AS F2 ON id2 = F2.name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多