Inner join on null id select row

We have two tables one with ids and one with names. Some id's are not required (are nullable) for example :

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

After we join this two tables we get id's and names. But if item3 Id is null that row is not shown.

Some data:

Table1

rowId, item1Id, item2Id, item3Id

1, 2, 3, 4

2, 1, 5, NULL

In our case we get as result one row ( 1 row)

So if it's null than it doesnt exists in Table2 and the row is not shown, but we would like to display null. So when we left join these two tables the result should have 2 rows.

This is the 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

For example because seasonId is sometimes null the join for Codings_7.coding is not shown, but I won`t to show also these rows where ids are null that the name also be null.

Answers


As stated by Nikola Markovinović you need to move the where conditions to the join conditions

here your select corrected:

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 ;

It is difficult to tell, what is being asked here, but I figure you need to do an outer join, and from the tsql tag I suppose you use MS SQL server, so here you go: http://msdn.microsoft.com/en-us/library/aa213228(v=sql.80).aspx

e.g.:

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

Need Your Help

ASP.NET MVC MEMBERSHIP

asp.net asp.net-mvc membership

I have just created a user in ASP.NET MVC ,and i want to insert him into Membership table. How can i do that? , because i can`t insert into Membership_Users

Naming struct field ids in Racket when creating struct

struct racket

I am learning Racket at the moment and would like to know if the following is possible out of the box in Racket. When I create an instance of a class I use the following syntax:

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.