SQL 服务器:如果两行中的列值不为空,则为 select 行
SQL Server : select row if column value is not null from two rows
我正在尝试为行项目的数据创建视图。我的 table 条目如下所示
item_type_id,item_type_name
1,I001
2,I002
item_model_id,item_model_name,item_type_id
1,I001M001,1
2,I001M002,1
3,I001M003,1
4,I002M001,2
5,I002M002,2
6,I002M003,2
item_price_id,item_type_id,item_model_id,item_price
1,1,NULL,149.99
2,2,NULL,249.99
3,1,3,199.99
4,2,6,299.99
cart_line_id,cart_id,item_model_id,quantity
1,1,3,5
2,1,1,15
我创建的视图是
create view dbo.vw_cart_line_items
as
select
cl.cart_line_id, cl.item_model_id, ipr.item_price_id,
itp.item_type_name, imd.item_model_name, cl.quantity, ipr.item_price
from
cart_lines cl
inner join
item_models imd on cl.item_model_id = imd.item_model_id
inner join
item_types itp on imd.item_type_id = itp.item_type_id
left outer join
item_prices ipr on ipr.item_type_id = imd.item_type_id
and (ipr.item_model_id = imd.item_model_id or
ipr.item_model_id is null)
go
查看结果为
cart_line_id,item_model_id,item_price_id,item_type_name,item_model_name,quantity,item_price
1,3,1,I001,I001M003,5,149.99
1,3,3,I001,I001M003,5,199.99
2,1,1,I001,I001M001,15,149.99
带有 item_model_id = 3 和 item_price_id = 1 的条目不适用于所选模型,因为存在特定条目 item_model_id = 3 和 item_price_id = 3 为它。另一个型号没有具体价格,所以它得到了通用价格。如何更新此查询以从输出中排除 item_model_id = 3 和 item_price_id = 1 的行?
好的,我知道你想做什么了。
一种方法是像这样加入 item_prices
:
left outer join item_prices ipr
on ipr.item_price_id = (
SELECT TOP 1 item_price_id
FROM item_prices ipr2
WHERE ipr2.item_type_id=imd.item_type_id
and (ipr2.item_model_id = imd.item_model_id or ipr2.item_model_id is null)
ORDER BY CASE WHEN ipr2.item_model_id = imd.item_model_id THEN 0 ELSE 1 END ASC
)
使用 TOP 1 子查询加入到 table 主键上的 table 保证你只从加入的 table 中得到一行,然后你使用 ORDER BY 来设置您想要优先的行的优先级。
我正在尝试为行项目的数据创建视图。我的 table 条目如下所示
item_type_id,item_type_name
1,I001
2,I002
item_model_id,item_model_name,item_type_id
1,I001M001,1
2,I001M002,1
3,I001M003,1
4,I002M001,2
5,I002M002,2
6,I002M003,2
item_price_id,item_type_id,item_model_id,item_price
1,1,NULL,149.99
2,2,NULL,249.99
3,1,3,199.99
4,2,6,299.99
cart_line_id,cart_id,item_model_id,quantity
1,1,3,5
2,1,1,15
我创建的视图是
create view dbo.vw_cart_line_items
as
select
cl.cart_line_id, cl.item_model_id, ipr.item_price_id,
itp.item_type_name, imd.item_model_name, cl.quantity, ipr.item_price
from
cart_lines cl
inner join
item_models imd on cl.item_model_id = imd.item_model_id
inner join
item_types itp on imd.item_type_id = itp.item_type_id
left outer join
item_prices ipr on ipr.item_type_id = imd.item_type_id
and (ipr.item_model_id = imd.item_model_id or
ipr.item_model_id is null)
go
查看结果为
cart_line_id,item_model_id,item_price_id,item_type_name,item_model_name,quantity,item_price
1,3,1,I001,I001M003,5,149.99
1,3,3,I001,I001M003,5,199.99
2,1,1,I001,I001M001,15,149.99
带有 item_model_id = 3 和 item_price_id = 1 的条目不适用于所选模型,因为存在特定条目 item_model_id = 3 和 item_price_id = 3 为它。另一个型号没有具体价格,所以它得到了通用价格。如何更新此查询以从输出中排除 item_model_id = 3 和 item_price_id = 1 的行?
好的,我知道你想做什么了。
一种方法是像这样加入 item_prices
:
left outer join item_prices ipr
on ipr.item_price_id = (
SELECT TOP 1 item_price_id
FROM item_prices ipr2
WHERE ipr2.item_type_id=imd.item_type_id
and (ipr2.item_model_id = imd.item_model_id or ipr2.item_model_id is null)
ORDER BY CASE WHEN ipr2.item_model_id = imd.item_model_id THEN 0 ELSE 1 END ASC
)
使用 TOP 1 子查询加入到 table 主键上的 table 保证你只从加入的 table 中得到一行,然后你使用 ORDER BY 来设置您想要优先的行的优先级。