SQL:Select和Inner在一个查询中连接三个表

时间:2014-05-06 01:23:43

标签: sql sql-server join inner-join where-clause

我正在尝试JOIN第一个SELECT子句的结果,前两个表(t1t2)与第三个表({{ 1}}):

t3

我做错了什么?

3 个答案:

答案 0 :(得分:1)

以下是查询的正确语法:

SELECT t1.*, t2.PropertyCode, t3.TBMonth
FROM Test.dbo.DailyBudgetExtract T1 JOIN
     Test.dbo.DailyPropertylListExtract T2 
     ON t1.propertyid = t2.proplistid OR t1.propertyid = t2.propertyid INNER JOIN
     Test.dbo.DailyTrialBalanceExtract T3
     ON t1.AccCode = t3.AcctCode;

where子句位于from子句之后。但是您不需要where子句,只需将条件放在on子句中,它应该用于显式连接。

答案 1 :(得分:1)

这种语法可能更清晰:

SELECT 
  t1.*, 
  t2.PropertyCode, 
  t3.TBMonth
FROM 
  Test.dbo.DailyBudgetExtract T1 
    JOIN
  Test.dbo.DailyPropertylListExtract T2 
    ON
  ( t1.propertyid = t2.proplistid 
      OR 
    t1.propertyid = t2.propertyid 
  )
    INNER JOIN
  Test.dbo.DailyTrialBalanceExtract T3
    ON 
  t1.AccCode = t3.AcctCode
;

答案 2 :(得分:0)

Join是投影的一部分,而不是选择(SQL数据库使用了一些relational algebra)。即使它碰巧在某些DB中可执行(我不认为它是),你应该避免它。

你应该使用EXISTS和NOT EXISTS(它们被称为半连接)。

以下查询是您的查询的“音译”。如果它没有返回你想要的东西,请告诉我。

SELECT  t1.*,
        t2.PropertyCode, 
        t3.TBMonth
FROM    Test.dbo.DailyBudgetExtract T1      
JOIN    Test.dbo.DailyPropertylListExtract T2 
ON      (t1.propertyid = t2.proplistid OR t1.propertyid = t2.propertyid)
JOIN    Test.dbo.DailyTrialBalanceExtract T3 
ON      t1.AccCode = t3.AcctCode

如果您碰巧不需要“t3.TBMonth”字段

SELECT  t1.*,
        t2.PropertyCode
FROM    Test.dbo.DailyBudgetExtract T1
JOIN    Test.dbo.DailyPropertylListExtract T2 
ON      (t1.propertyid = t2.proplistid OR t1.propertyid = t2.propertyid)
WHERE   EXISTS(SELECT 1 FROM Test.dbo.DailyTrialBalanceExtract T3 WHERE t1.AccCode = t3.AcctCode)

提示与注意事项:

  • 至少在SQL Server中,“INNER JOIN”和“JOIN”之间没有差异,所以选择一个并继续使用它;
  • 使用“... FROM table1 t1,table t2”与CROSS JOIN相同;
  • 避免使用OR进行JOIN条件(您使用“... FROM table1 t1,table t2”加上“t1.propertyid = t2.proplistid OR t1.propertyid = t2”进行JOIN [aka INNER JOIN]。 propertyid“)他们放慢了查询的速度;