Sql server t-sql左外连接难题

Sql server t-sql左外连接难题,sql-server,tsql,Sql Server,Tsql,一些简单的数据集可以说明这个问题: SELECT * FROM LeftTable OID Name LeftBlah 1 Name1 LeftBlah1 2 Name2 LeftBlah2 SELECT * FROM JoinTable OID Name RightBlah 1 Name1 RightBlah1 2 Name1-Dumb1 RightBlah1-Dumb1 3 Name1-Dumb2 RightBlah1-Dumb2 4 N

一些简单的数据集可以说明这个问题:

SELECT * FROM LeftTable

OID Name    LeftBlah
1   Name1   LeftBlah1
2   Name2   LeftBlah2

SELECT * FROM JoinTable

OID Name    RightBlah
1   Name1   RightBlah1
2   Name1-Dumb1 RightBlah1-Dumb1
3   Name1-Dumb2 RightBlah1-Dumb2
4   Name2-Dumb1 RightBlah2-Dumb1
5   Name2-Dumb2 RightBlah2-Dumb2
查询这些表的方法之一,然后是查询输出:

SELECT L.Name, L.LeftBlah, J.Name AS JName, J.RightBlah, LEFT(J.Name, 5) AS WFT
FROM LeftTable AS L
LEFT OUTER JOIN JoinTable AS J ON (L.Name = J.Name)

Name    LeftBlah    JName   RightBlah   WFT
Name1   LeftBlah1   Name1   RightBlah1  Name1
Name2   LeftBlah2   NULL    NULL    NULL
SELECT L.Name, L.LeftBlah, J.Name AS JName, J.RightBlah, LEFT(J.Name, 5) AS WFT
FROM LeftTable AS L
LEFT OUTER JOIN JoinTable AS J ON (L.Name = LEFT(J.Name, 5))

Name    LeftBlah    JName   RightBlah   WFT
Name1   LeftBlah1   Name1   RightBlah1  Name1
Name1   LeftBlah1   Name1-Dumb1 RightBlah1-Dumb1    Name1
Name1   LeftBlah1   Name1-Dumb2 RightBlah1-Dumb2    Name1
Name2   LeftBlah2   Name2-Dumb1 RightBlah2-Dumb1    Name2
Name2   LeftBlah2   Name2-Dumb2 RightBlah2-Dumb2    Name2
我查询这些表的另一种方法是查询输出:

SELECT L.Name, L.LeftBlah, J.Name AS JName, J.RightBlah, LEFT(J.Name, 5) AS WFT
FROM LeftTable AS L
LEFT OUTER JOIN JoinTable AS J ON (L.Name = J.Name)

Name    LeftBlah    JName   RightBlah   WFT
Name1   LeftBlah1   Name1   RightBlah1  Name1
Name2   LeftBlah2   NULL    NULL    NULL
SELECT L.Name, L.LeftBlah, J.Name AS JName, J.RightBlah, LEFT(J.Name, 5) AS WFT
FROM LeftTable AS L
LEFT OUTER JOIN JoinTable AS J ON (L.Name = LEFT(J.Name, 5))

Name    LeftBlah    JName   RightBlah   WFT
Name1   LeftBlah1   Name1   RightBlah1  Name1
Name1   LeftBlah1   Name1-Dumb1 RightBlah1-Dumb1    Name1
Name1   LeftBlah1   Name1-Dumb2 RightBlah1-Dumb2    Name1
Name2   LeftBlah2   Name2-Dumb1 RightBlah2-Dumb1    Name2
Name2   LeftBlah2   Name2-Dumb2 RightBlah2-Dumb2    Name2
桌子的设计很愚蠢,但我不能改变它。第二个表的名称字段中带有“-”的条目是一些小丑的“魔术般的细线”方式,表明它们是“主要事物”(两个表中的名称相同)的子细节。如果第二个表中缺少“主要内容”,这可能表示数据问题或正常情况(呵呵)。。。如果没有子细节,丢失可能是正常的,但也有可能在没有子细节的情况下丢失主要内容。第一个查询显示了您所期望的“主要内容”——第二个表中的空数据。第二个查询省去了空行

起初,我认为这是左外联接的一个问题,但是,它已经完成了将第一个表中的每一行返回的工作。如果它为Name2返回一个空行,它可能会为Name1返回一个空行,我肯定不希望这样

有趣的是,通过两个查询的并集,我实际上可以得到我想要的。我不明白为什么我没有得到一堆重复的行,但我是一个不情愿的程序员,我对得到我想要的结果比理解所有复杂的编码更感兴趣。不幸的是,我想要的结果将需要比两个查询表单对我正在处理的实际数据的简单合并运行得更快

所以,最后,我的问题是:是否有一种方法可以以某种巧妙的方式获得联盟的结果,从而避免这种方法的浪费,从而导致执行缓慢?

默认情况下,这种方法具有明显的效果。如果要复制,请使用UNION ALL

联合是非常有效的,可能是这里最好的方法。努力优化个人选择

我认为您可以将第二个表更改为join(不是左)和add and(L.Name J.Name)

表的设计很愚蠢。。。的确如此。我喜欢你的样本数据。