2017-10-13 109 views
1

我有一个运行SQL Server Express数据库的系统,我需要从中提取一些数据。我创建了基本的SQL查询,但是我发现有些数据位于其他地方。SQL查询从另一个表中提取数据IF NULL

基本前提是我有修理订单,车辆和客户的数据库。车辆通常通过VIN解码器添加,因此它们具有来自MAKE和MODEL表的ID关联。但是在VIN不解码的情况下,应用程序允许用户手动输入此信息,然后将其存储在另一个名为“UserVehicleAttributes”的表中。在此表中有VehicleID,AttributeName,& AttributeValue。

UserAttributeId VehicleId AttributeName AttributeValue 
----------------------------------------------------------- 
364     6829  Model   Sedona 
365     6830  Make   Kia 
366     6830  Model   Sedona 

所以我需要的是,如果品牌或型号的车辆台出现为NULL,我可以显示的内容,如手动输入。

我发现,在DB的现有功能看起来能够做我所需要的,但我不知道如何将它用作我的查询的一部分。

SET ANSI_NULLS ON 
 
GO 
 
SET QUOTED_IDENTIFIER ON 
 
GO 
 

 
ALTER FUNCTION [SM].[fnVehicleModelName]() 
 
RETURNS TABLE 
 
AS 
 
RETURN 
 
(
 
\t SELECT DISTINCT v.VehicleId, 
 
\t \t CASE 
 
\t \t \t WHEN v.SubModelId IS NULL THEN ISNULL(ua.[AttributeValue],'') 
 
\t \t \t ELSE smm.[Name] 
 
\t \t END as Model 
 
\t FROM SM.Vehicle v (NOLOCK) 
 
\t LEFT OUTER JOIN 
 
     (SELECT sm.SubModelId, m.[Name] + ' ' + sm.[Name] as Name 
 
       FROM DMV.SubModel (NOLOCK) sm 
 
\t \t \t \t \t INNER JOIN DMV.Model m (NOLOCK) 
 
\t \t \t \t \t \t \t ON sm.ModelId = m.ModelId) as smm 
 
      ON v.SubModelId = smm.SubModelId    
 
    LEFT OUTER JOIN SM.UserVehicleAttributes ua (NOLOCK)-- 
 
    \t \t \t ON v.VehicleId = ua.VehicleId and ua.AttributeName = 'Model'

任何帮助是极大的赞赏。我对SQL不太好(显然),但我试图找出这一点。

+0

一对夫妇澄清的问题:(1)其他表格的结构是什么? (2)是在任何/所有表格之间共享的标识符? – Chris

+0

对于空结果,是否返回一行作为make,null ...或者'make'是否完全不出现? – Twelfth

回答

0

我不知道你为什么使这个函数没有参数 - 这与视图是一样的。考虑如果在这里使用视图可能会简化这种情况。

你说得对,ISNULL就是你想在这里使用的,但我认为这个连接应该更简单。你的情况基本上是“从具有非空值的表中抽取列值,首先优先选择一个表”

在外连接中,如果外连接表中的所有列都不为空匹配,如果匹配,所有的值都应该填入。知道......你应该可以做这样的事情......(作为一个例子来说明这个概念是如何工作的,而不是解决你的查询你)

select v.VehicleId, 
    VehicleName = isnull(Model.Name, UserVehicle.Name) 
from Vehicle v 
left outer join Model on Model.VehicleID = Vehicle.VehicleID 
left outer join UserVehicle on UserVehicle.VehicleID = Vehicle.VehicleId 

所以,这样做是从任一表中加入可能的行,并且ISNULL宏选择哪个值非空。对其余的列做这件事,并根据你的情况修正连接条件,你应该是金的。

0

该函数没有参数,如果你想用它重写它作为一个看法,但它只能显示模式,让你可以使用这样的子查询:

SELECT 
    VehicleId, 
    CASE 
    WHEN Make IS NULL 
    THEN (SELECT AttributeValue FROM UserVehicleAttributes 
     WHERE VehicleId = Vehicles.VehicleId 
     AND AttributeName = 'Make') 
    ELSE Make 
    END AS Make, 
    CASE 
    WHEN Model IS NULL 
    THEN (SELECT AttributeValue FROM UserVehicleAttributes 
     WHERE VehicleId = Vehicles.VehicleId 
     AND AttributeName = 'Model') 
    ELSE Model 
    END AS Model 
FROM 
    Vehicles 
+0

你可以在这里查看sql提琴:http://sqlfiddle.com/#!9/3b1ca0/5/0 – espino316

相关问题