sql - 捕获连接表达式中的所有记录

标签 sql t-sql join sql-server-2008-r2 left-join

我有一个非常简单(我认为这很简单,但我仍然在挣扎!)的问题。我有一张汽车表。我还有另一张汽车类别表。我想加入另一个以获得汽车的类别。

汽车表很简单,包含型号和品牌。类表还包含型号、品牌和类类型。当我想要将相同品牌的汽车分组在一起而不管其型号如何时,问题就出现了。

例如,我有两辆车:

id  vehiclemake vehiclemodel
1   AUDI            R8
2   AUDI            Quattro

我有两个类(class):

id  vehiclemake vehiclemodel    classtype
1   AUDI            R8          A
2   AUDI            NULL        B

奥迪 R8 将匹配 A 类类型。我希望所有其他 AUDI,无论其型号如何,都匹配 B 类类型。

我这里有一些示例代码,您可以尝试一下!

create table #vehicle(id int, vehiclemake varchar(10), vehiclemodel varchar(10))
create table #vehicleclass(id int, vehiclemake varchar(10), vehiclemodel varchar(10), classtype varchar(1))


insert into #vehicle values(1, 'AUDI', 'R8')
insert into #vehicle values(2, 'AUDI', 'Quattro')

insert into #vehicleclass values(1, 'AUDI', 'R8', 'A')
insert into #vehicleclass values(2, 'AUDI', null, 'B')


select 
*
from
#vehicle v
left join #vehicleclass vc on 
(v.vehiclemake = vc.vehiclemake and v.vehiclemodel = vc.vehiclemodel)


drop table #vehicle
drop table #vehicleclass

上面的语句没有将Quattro记录连接到B类记录

最佳答案

使用 COALESCEvehiclemodel 的连接上,这样当 vehicleclass 表上的模型为 NULL 时,车辆将改为匹配其自己的模型。

[编辑]:阅读用户的评论后,请尝试以下操作:

SELECT *
    FROM #vehicle v
        INNER JOIN #vehicleclass vc 
            ON v.vehiclemake = vc.vehiclemake 
                AND v.vehiclemodel = vc.vehiclemodel
UNION
SELECT *
    FROM #vehicle v
        INNER JOIN #vehicleclass vc 
            ON v.vehiclemake = vc.vehiclemake 
                AND vc.vehiclemodel IS NULL
    WHERE NOT EXISTS(SELECT 1
                         FROM #vehicleclass vc2
                         where vc2.vehiclemake = v.vehiclemake
                            and vc2.vehiclemodel = v.vehiclemodel);

关于sql - 捕获连接表达式中的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29540355/

相关文章:

sql-server - 查找非字母字符串中的字符串

sql-server - tsql for xml,复杂的 xml

sql - 在 SQL 内连接中“跳过”一个表

sql - 在一个查询中分组两次

SQL查询where基于列值

sql - Oracle子查询与Join - 如何引用子查询列?

mysql - 如何在mysql中使用INNER JOIN从两个表中删除行?

MySQL:仅订购大于特定值的值

sql - ORDER BY 后跟一个数字

mysql - Group BY 子查询返回多于 1 行