用Where子句加入两个表

时间:2014-05-06 08:16:56

标签: sql sql-server sql-server-2008 join

我有两张桌子。猫和数据。

Cat
  Cat_Serno
  Cat_Name 

 Data
  Data_Serno
  Data_Name
  Data_Cat_ID
  Data_Project_ID

当我正在进行常规加入时,我正在

 SELECT t1.*,t2.* 
 FROM Cat t1 
      LEFT JOIN Data t2 ON t1.Cat_Serno = t2.Data_Cat_Id

enter image description here

但是当我在Project_Id上应用where条件时,它只给我一列。如果Data表中没有相关数据以及Project_Id上的where子句,我想显示所有类别和Null。如果我使用带有project_id的where子句而不包含Data表中的任何值(例如:Project_Id = 2),它也应该包含Null,即使数据表中没有2。

当我使用Project_Id = 2(数据表中不存在)时,我只获得一个具有空值的记录。 enter image description here

4 个答案:

答案 0 :(得分:1)

如果您在where子句中包含column table Data,则join几乎会充当inner join,因此如果您想要Cat table的所有记录,您不应在column子句中包含任何where数据表,但如果您想申请条件,则可以将其包含在" on"在join试试这个,

SELECT t1.*,t2.* 
 FROM Cat t1 
      LEFT JOIN Data t2 ON t1.Cat_Serno = t2.Data_Cat_Id
          and Project_Id=2

答案 1 :(得分:1)

您必须使用所需值添加where条件,并使用IS NULL

添加OR条件

示例:

WHERE (DataName = 'Data_One' OR DataName IS NULL)

请注意,NULL不等于任何值(包括NULL),因此您必须处理它。

另一种方式:

WHERE COALESCE(DataName, 'n/a') IN ('Data_One', 'n/a')

答案 2 :(得分:0)

如果您想从Data和Cat中返回记录,当相对表中没有匹配的记录时,请执行FULL OUTER JOIN,而不是LEFT / RIGHT join。

此外,要从任一表中过滤记录而不过滤整个结果集,请在语句的ON部分应用条件,而不是语句的WHERE部分。例如:

SELECT t1.*, t2.* FROM Cat t1 FULL OUTER JOIN Data t2 
     ON t1.Cat_Serno = t2.Data_Cat_Id 
    AND t2.Data_Project_Id = 2

答案 3 :(得分:0)

尝试:

WHERE t2.project_id = ...
OR t2.project_id IS NULL;