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

标签 sql oracle

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/

相关文章:

sql - 在 T-SQL 中输出逗号分隔的列表

mysql - 如何在mysql中编写这个特定的查询?

php - 解决mysql最大用户连接错误的正确方法

sql - 在组内进行比较以获取共同值(value)

java - jdbc 可以通过 SOCKS 代理连接到 Oracle 数据库吗?

java - 在外部主机上运行时缺少 Oracle 数据库连接驱动程序

oracle - container-registry.oracle.com/database/enterprise 的 pull 访问被拒绝

SQL IN 查询优化

c# - 在 ASP.NET 中插入时缺少 SELECT 关键字

sql - 将 STRING_AGG 转换为 FOR XML 路径