【问题标题】:SQL: Select and Inner Join three tables in one querySQL:在一个查询中选择和内连接三个表
【发布时间】:2023-04-06 06:03:02
【问题描述】:

我正在尝试JOIN 第一个SELECT 子句的结果,在前两个表(t1t2)之间,第三个表(t3):

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

我做错了什么?

【问题讨论】:

  • 由于表(和dbo)的三部分命名,我删除了Oracle标签。
  • @VitorTyburski 你能帮我选一个合适的吗?
  • @user3586244 GordonLinoff 的答案已经是直接正确的,但我在我的网站上添加了一些您可能喜欢的信息;)

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


【解决方案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次相同的答案。请进行编辑或 cmets。
  • @VitorTyburski 我在你发帖之前就开始回答了,但是,我不得不离开我的笔记本电脑。我想当我回来、完成并提交时,你打败了我。恭敬地,我也认为虽然答案可能相同,但我的格式可能会帮助一些新手更好地理解和“看到”解决方案。似乎至少有 4 个其他用户同意。请重新考虑您的否决...谢谢。
【解决方案2】:

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

您应该改用 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. propertyid") 他们大大减慢了查询速度;

【讨论】:

    【解决方案3】:

    以下是查询的正确语法:

    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 子句中,它应该用于显式连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2016-02-05
      • 2020-10-25
      相关资源
      最近更新 更多