我正在尝试JOIN
第一个SELECT
子句的结果,前两个表(t1
和t2
)与第三个表({{ 1}}):
t3
我做错了什么?
答案 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)
提示与注意事项: