Sql server SQL Server:如果两行中的列值不为null,请选择行

Sql server SQL Server:如果两行中的列值不为null,请选择行,sql-server,tsql,sql-view,Sql Server,Tsql,Sql View,我正在尝试为行项目中的数据创建视图。我的表条目如下所示 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,N

我正在尝试为行项目中的数据创建视图。我的表条目如下所示

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

项目\模型\ id=3且项目\价格\ id=1的分录不适用于所选模型,因为该模型有一个特定的分录项目\模型\ id=3且项目\价格\ id=3。另一个模型没有具体的价格,所以它得到了通用的价格。如何更新此查询以从输出中排除item_model_id=3和item_price_id=1的行?

好的,我知道您要做什么了

一种方法是让您加入到
商品价格中,如下所示:

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子查询连接到表PK上的表可以保证从连接的表中只获得一行,然后使用ORDER BY设置要具有优先级的行的优先级。

好的,我知道您要做什么了

一种方法是让您加入到
商品价格中,如下所示:

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子查询连接到表主键上的表可以保证您只从连接的表中获得一行,然后使用ORDER BY设置您希望具有优先级的行的优先级。

什么意思,“另一个模型没有特定的价格”?对我来说,他们两个看起来都有一个特定的价格。是什么使价格“特定”与“通用”?我认为当item_type_id为null时,价格是通用的,并且只有在没有相应的特定结果时才需要通用结果。这是正确的吗?这是正确的,当item_model_id为空时,对于所有item_models没有价格表条目但具有item_type_id的item_models,价格是通用的。您说的“另一个型号没有特定价格”是什么意思?对我来说,他们两个看起来都有一个特定的价格。是什么使价格“特定”与“通用”?我认为当item_type_id为null时,价格是通用的,并且只有在没有相应的特定结果时才需要通用结果。这是正确的吗?这是正确的,当item_model_id为空时,对于所有没有价格表条目但具有item_type_id的item_模型,价格是通用的。