2015-12-18 34 views
3

这是一个尴尬的问题!但是我现在还没有使用tsql一段时间。为什么我的内部连接不起作用

我有3个表:

  • 工作
  • 画廊
  • JobWorkUnit

Gallery主键链接到相应的外键Job。主键JobWorkUnit链接到相应的外键Job

我希望返回Job上的所有记录,而不管它们在其他2个表中是否有'链接'。

我以为用LEFT OUTER JOIN就是这样做的,但是我根本没有得到任何记录。

有人可以检查我的代码吗?

SELECT 
    * 
FROM 
    Job J 
LEFT OUTER JOIN 
    Gallery G ON G.JobRef = J.JobRef 
LEFT OUTER JOIN 
    JobWorkUnit JWU ON J.JobRef = JWU.JobRef 
WHERE 
    J.Active = 1 
    AND G.Active = 1 
    AND JWU.Active = 1 
    AND J.CompanyRef = @CompanyRef 

有在WorkUnitGallery

没有记录,如果我删除:

AND G.Active = 1 
AND JWU.Active = 1 

我得到2条回来,我Where子句重写我的连接类型。这是一个公平的事情吗?

+1

'job'中是否有任何行?你有'where'条款吗?为什么标题询问内部连接? –

+0

@MartinSmith感谢您的评论。是的,Jobin中有definatley行:)。我已经测试它没有使用连接,我得到2记录返回 –

+0

但是,我确实有一个Where的原因,这就是这种情况,所以Iwill编辑我的问题。谢谢让我关注:) –

回答

2

这只是一个风格/清晰度的问题,但我p请不要在连接条件中过滤数据。我想这样重写查询:

SELECT 
* 
FROM 
    Job J 
Left OUTER JOIN Gallery G 
ON 
    G.JobRef = J.JobRef 
LEFT OUTER JOIN JobWorkUnit JWU 
ON 
    J.JobRef = JWU.JobRef 
WHERE 
    J.Active = 1 
AND 
    (G.Active = 1 OR G.Active IS NULL) 
AND 
    (JWU.Active = 1 OR JWU.Active IS NULL) 
AND 
    J.CompanyRef = @CompanyRef 

就个人而言,我认为表达了查询的意图最清楚。

编辑: 就意识到,实际上没有人明确地解释为什么

当您执行外连接时,外连接的表的字段在没有连接时为空。如果您接着使用WHERE子句中的那些字段,则它们将失败所有过滤条件(当然除外IS NULL),就像空值一样。

+0

刚回来。感谢您的回答。请给我几分钟消化。谢谢:) –

+2

并与此查询您成功地不使用可能的索引。更好地结合那些''或活动是空' –

+0

@GiorgiNakeuri我认为你的评论摆在我这里 –

2

这个查询将返回零个结果只有在job表是空

修订:显示where

SELECT * 
FROM Job J 
    left join Gallery G ON J.JobRef = G.JobRef 
     and G.Active = 1 
    left join JobWorkUnit JWU on J.JobRef = JWU.JobRef 
     and JWU.Active = 1 
where J.Active = 1 
    and J.CompanyRef = @CompanyRef 
+0

刚刚回来。感谢您的回答。请给我几分钟消化。谢谢:) –

+0

我甚至没有意识到我可以做到这一点。 –

+0

我现在必须决定是否将过滤放入连接中或者我不确定。只要 –

5

你应该将过滤,加入的条件,其他的方式你只是过滤掉具有空值的行:

SELECT * 
FROM Job J 
     LEFT OUTER JOIN Gallery G ON G.JobRef = J.JobRef 
            AND G.Active = 1 
     LEFT OUTER JOIN JobWorkUnit JWU ON J.JobRef = JWU.JobRef 
              AND JWU.Active = 1 
WHERE J.Active = 1 
     AND J.CompanyRef = @CompanyRef 
+0

刚回来,我会尽快接受答案。感谢您的回答。请给我几分钟消化。谢谢:) –

+0

我甚至没有意识到我可以做到这一点。 –

+0

我现在要决定是否将过滤放入连接中或者我不确定。我会尽快接受答案 –

相关问题