gpt4 book ai didi

sql - Oracle SQL - 查询子表以查找匹配的父表

转载 作者:行者123 更新时间:2023-12-02 09:13:43 24 4
gpt4 key购买 nike

Table vehicle_master
vehicle_id | vin
1 | 1234
2 | 5678
3 | 9123

Table vehicle_inventory

vehicle_id | key | value
-----------|-----------|------
1 | Make | Honda
1 | Model | Civic
1 | Year | 2004
2 | Make | Toyota
2 | Model | Corolla
2 | Year | 2005
2 | color | white (every row is optnl: key/row may or may not exist in db)
3 | Make | Honda
3 | Model | Civic
3 | Year | 2004
3 | color | blue

我正在尝试查找具有给定品牌、型号和颜色的车辆。可以在输入查​​询中指定颜色限制,但在数据库中可能不可用。如果数据库中的汽车没有指定颜色,即使在查询中指定了颜色也应该匹配

到目前为止我拥有的 SQL:

select * from vehicle_master vm where 1=1
and exists(
select 1 from vehicle_inventory vi
where vi.vehicle_id=vm.vehicle_id
and (vi.key=':make' and vi.value=':makeValue')
)
and exists(
select 1 from vehicle_inventory vi
where vi.vehicle_id=vm.vehicle_id
and (vi.key=':model' and vi.value=':modelValue')
)
and exists(
select 1 from vehicle_inventory vi
where vi.vehicle_id=vm.vehicle_id
and (vi.key=':color' and vi.value=':colorValue')
)

对于输入品牌:丰田,型号:花冠,颜色:白色,我得到预期的结果 2|5678。

如果我输入品牌:本田,型号:思域,颜色:红色,我将得不到匹配或结果,因为数据库中不存在本田的颜色键。我希望在这种情况下忽略颜色限制,因为没有数据库条目。我希望仅当颜色存在键和值时才在搜索中考虑颜色

如果带有键的行存在,如何使键/值对有条件匹配,如果数据库中不存在键/值行,则忽略限制?

编辑:每个键都是可选的

最佳答案

我会在这里使用聚合。例如,要搜索白色本田思域,我们可以尝试:

SELECT
vm.vehicle_id,
vm.vin
FROM vehicle_inventory vi
INNER JOIN vehicle_master vm
ON vi.vehicle_id = vm.vehicle_id
GROUP BY vm.vehicle_id, vm.vin
HAVING
SUM(CASE WHEN vi.key = 'Make' AND vi.value = 'Honda' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN vi.key = 'Model' AND vi.value = 'Civic' THEN 1 ELSE 0 END) > 0 AND
(SUM(CASE WHEN vi.key = 'color' AND vi.value = 'white' THEN 1 ELSE 0 END) > 0 OR
SUM(CASE WHEN vi.key = 'color' THEN 1 ELSE 0 END) = 0);

HAVING 子句的最后两项用简单的英语来说就是查找颜色为白色的车辆根本没有颜色的车辆。

关于sql - Oracle SQL - 查询子表以查找匹配的父表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49187100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com