【问题标题】:Inner join on null id select row空 id 选择行上的内部联接
【发布时间】:2012-09-01 09:10:19
【问题描述】:

我们有两张表,一张有 id,一张有名字。某些 id 不是必需的(可以为空),例如:

rowId item1Id, item2Id, item3Id (item3Id can be null)

在我们加入这两个表后,我们会得到 id 和名称。但如果 item3 Id 为 null,则不会显示该行。

一些数据:

表1

rowId, item1Id, item2Id, item3Id

1、2、3、4

2、1、5、空

在我们的例子中,我们得到一行(1 行)

因此,如果它为 null,则它在 Table2 中不存在并且未显示该行,但我们希望显示 null。 所以当我们离开连接这两个表时,结果应该有 2 行。

这是sql:

SELECT Recipes.recipeId, Recipes.userId,Users.firstName + ' ' + Users.lastName as userName,  servingTypeId,
Codings.coding as servingType, categoryId, Codings_2.coding as healthAspects, continentId,
Codings_3.coding as continent, countryId, CodingsAssociated.coding as country, typeOfPreparationId,
Codings_4.coding as typeOfPreparation, flavourId, Codings_5.coding as flavour, preparationSkillId,
Codings_6.coding as preparationSkill, seasonId,  activePreparationTime,
overallPreparationTime, isLocalDelight, servings, Codings_7.coding as season ,
calories, youTubeId, datePosted, isComposite, Recipes.isApproved, Recipes.timestamp, title,
localDelightRegion, otherFeatures, cookingInstructions 
      FROM Recipes LEFT OUTER JOIN

      Codings ON Recipes.servingTypeId = Codings.codingKeyId LEFT OUTER JOIN
      Codings as Codings_2 ON Recipes.categoryId = Codings_2.codingKeyId LEFT OUTER JOIN
      Codings as Codings_3 ON Recipes.continentId = Codings_3.codingKeyId LEFT OUTER JOIN
      CodingsAssociated ON Recipes.countryId = CodingsAssociated.codingKeyId LEFT OUTER JOIN
      Codings as Codings_4 ON Recipes.typeOfPreparationId = Codings_4.codingKeyId LEFT OUTER JOIN
      Codings as Codings_5 ON Recipes.flavourId = Codings_5.codingKeyId LEFT OUTER JOIN
      Codings as Codings_6 ON Recipes.preparationSkillId = Codings_6.codingKeyId LEFT OUTER JOIN
      Codings as Codings_7 ON Recipes.seasonId = Codings_7.codingKeyId  LEFT OUTER JOIN
      RecipesTranslations ON Recipes.recipeId = RecipesTranslations.recipeId LEFT OUTER JOIN
      Users ON Recipes.userId = Users.userId

      WHERE CodingsAssociated.languageId = @languageId AND Codings.languageId = @languageId
      AND Codings_2.languageId = @languageId AND Codings_3.languageId = @languageId
      AND Codings_4.languageId = @languageId AND
      Codings_5.languageId = @languageId AND Codings_6.languageId = @languageId AND RecipesTranslations.languageId = @languageId
      AND Codings_7.languageId = @languageId

例如,由于 seasonId 有时为 null,因此 Codings_7.coding 的连接未显示,但我也不会显示 id 为 null 且名称也为 null 的这些行。

【问题讨论】:

  • 左连接会做你想做的事。但是,如果您过滤 table2 列上的表,您将有效地恢复到内部联接。所有此类过滤器都应移至 ON 子句。
  • 很难说,这里问的是什么,但我想你需要做一个外连接,从 tsql 标签我想你使用 MS SQL 服务器,所以你去:@ 987654321@
  • 您真的需要整个查询来演示问题吗? Table1 和 item3Id 不在发布的查询中。
  • 你试过把WHERE CodingsAssociated.languageId = @languageId AND Codings.languageId = @languageId改成AND CodingsAssociated.languageId = @languageId AND Codings.languageId = @languageId吗?

标签: mysql sql tsql inner-join


【解决方案1】:

很难说,这里问的是什么,但我想你需要做一个外连接,从 tsql 标签我想你使用 MS SQL 服务器,所以你去:http://msdn.microsoft.com/en-us/library/aa213228(v=sql.80).aspx

例如:

SELECT *
FROM table1 a LEFT OUTER JOIN table2 b 
ON a.id_to_join_on = b.id_to_join_on

【讨论】:

  • 我试试这个并用 LEFT OUTER JOIN 更改 INNER JOIN 但包含 seasinId null 的行没有显示(如果季节 ID 为空,它不能显示季节,但我希望它为空还显示季节名称 null) 如果您理解
  • 对不起,您发布的select语句中没有seasinId,所以我还是不明白。让我们尝试将这个问题缩小到仅左连接两个表。那么哪个表包含seasionID,哪个表包含season_name
【解决方案2】:

Nikola Markovinović 所述,您需要将 where 条件移至连接条件

这里您的选择已更正:

SELECT
   Recipes.recipeId,
   Recipes.userId,
   ---
   cookingInstructions 
FROM
   Recipes
   LEFT OUTER JOIN Codings ON
      Recipes.servingTypeId = Codings.codingKeyId AND
      Codings.languageId = @languageId
   LEFT OUTER JOIN Codings as Codings_2 ON 
      Recipes.categoryId = Codings_2.codingKeyId AND
      Codings_2.languageId = @languageId
   LEFT OUTER JOIN Codings as Codings_3 ON
      Recipes.continentId = Codings_3.codingKeyId AND
      Codings_3.languageId = @languageId
   LEFT OUTER JOIN CodingsAssociated ON
      Recipes.countryId = CodingsAssociated.codingKeyId AND
      CodingsAssociated.languageId = @languageId 
   LEFT OUTER JOIN Codings as Codings_4 ON
      Recipes.typeOfPreparationId = Codings_4.codingKeyId AND
      Codings_4.languageId = @languageId
   LEFT OUTER JOIN Codings as Codings_5 ON
      Recipes.flavourId = Codings_5.codingKeyId AND
      Codings_5.languageId = @languageId
   LEFT OUTER JOIN Codings as Codings_6 ON
      Recipes.preparationSkillId = Codings_6.codingKeyId AND
      Codings_6.languageId = @languageId
   LEFT OUTER JOIN Codings as Codings_7 ON
      Recipes.seasonId = Codings_7.codingKeyId AND
      Codings_7.languageId = @languageId
   LEFT OUTER JOIN RecipesTranslations ON
      Recipes.recipeId = RecipesTranslations.recipeId AND
      RecipesTranslations.languageId = @languageId
   LEFT OUTER JOIN Users ON
      Recipes.userId = Users.userId ;

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 2018-11-01
    • 2010-12-26
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多