SQL 2 左外连接

问题描述 投票:0回答:1

我有这个代码

SELECT  tb1.id, tb1.start, tb1.end, tb1.name, 
        tb1.code, ROUND  (Try_cast(tb2.Value as float),0) AS variable1 
FROM    tb1 
LEFT OUTER JOIN tb2 ON tb1.id = tb2.ID
AND tb2.Descript LIKE '%Something%'
WHERE     (tb1.star >= 0)
ORDER BY...

而且效果非常好。我从表 1 中选择值并从表 2 中添加变量 1。 但现在我需要从表2中添加另一个变量。我尝试复制它(意味着2x ROUND... as... + 2x LEFT OUTER JOIN,它只取变量1的值。然后我发现了Union,它执行,但它不会为variable2添加另一列,代码如下

SELECT  tb1.id, tb1.start, tb1.end, tb1.name, 
        tb1.code, ROUND  (Try_cast(tb2.Value as float),0) AS variable1 
FROM    tb1 
LEFT OUTER JOIN tb2 ON tb1.id = tb2.ID
AND tb2.Descript LIKE '%Something%'     

UNION ALL

SELECT  tb1.id, tb1.start, tb1.end, tb1.name, 
        tb1.code, ROUND  (Try_cast(tb2.Value as float),0) AS variable2
FROM    tb1 
LEFT OUTER JOIN tb2 ON tb1.id = tb2.ID
AND tb2.Descript LIKE '%Somethingelse%' 
WHERE     (tb1.star >= 0)
ORDER BY...

你能帮我一下吗?谢谢你

sql left-join outer-join
1个回答
0
投票

我根据您的两个 SQL 语句做出一些假设,但看起来您的架构是 EAV 架构,或者与 EAV 架构密切相关。因此,您可能需要在 FROM 子句中添加一个新的

LEFT OUTER JOIN
,以从
tb2
中获取与您要过滤的
Descript
相对应的值。

这看起来像:

SELECT  tb1.id, tb1.start, tb1.end, tb1.name, 
        tb1.code, ROUND  (Try_cast(tb2.Value as float),0) AS variable1 
        , ROUND  (Try_cast(tb3.Value as float),0) as variable2
FROM    tb1 
LEFT OUTER JOIN tb2 ON tb1.id = tb2.ID
    AND tb2.Descript LIKE '%Something%'
LEFT OUTER JOIN tb2 AS tb3 ON tb1.id = tb2.id 
    AND tb3.Descript LIKE '%Somethingelse%'

因为当我们第二次连接同一个表时,我们将连接同一个表两次 (

tb2
),所以我们给它一个别名
tb3
,这样两个版本都可以在
SELECT
子句中引用(以及查询中的其他位置)需要)。

© www.soinside.com 2019 - 2024. All rights reserved.