我有一个运行SQL Server Express数据库的系统,我需要从中提取一些数据。我已经创建了基本的SQL查询,但我发现有些数据位于其他地方。
基本前提是我有一个维修订单,车辆和客户的数据库。车辆通常通过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
所以我需要的是如果Make或Model从Vehicle表中显示为NULL,我可以显示手动输入的内容。
我发现数据库中存在一个看起来能够做我需要的功能,但我不知道如何在查询中使用它。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [SM].[fnVehicleModelName]()
RETURNS TABLE
AS
RETURN
(
SELECT DISTINCT v.VehicleId,
CASE
WHEN v.SubModelId IS NULL THEN ISNULL(ua.[AttributeValue],'')
ELSE smm.[Name]
END as Model
FROM SM.Vehicle v (NOLOCK)
LEFT OUTER JOIN
(SELECT sm.SubModelId, m.[Name] + ' ' + sm.[Name] as Name
FROM DMV.SubModel (NOLOCK) sm
INNER JOIN DMV.Model m (NOLOCK)
ON sm.ModelId = m.ModelId ) as smm
ON v.SubModelId = smm.SubModelId
LEFT OUTER JOIN SM.UserVehicleAttributes ua (NOLOCK)--
ON v.VehicleId = ua.VehicleId and ua.AttributeName = 'Model'
非常感谢任何帮助。我对SQL(显然)并不是很了解,但我想把它弄清楚。
答案 0 :(得分:0)
我不确定你为什么要把它变成没有参数的函数 - 这与视图有点相同。考虑在这里使用视图是否可以简化情况。
你是错的,你想在这里使用ISNULL,但我认为连接应该更简单。您的情况基本上是“从任何具有非空值的表中提取列值,首先优先选择一个表”
在外部联接中,如果没有匹配项,外部联接表中的所有列都将为null,如果匹配,则应填写所有值。知道...您应该能够做这样的事情......(作为一个例子,澄清这个概念是如何工作的,而不是为你解决问题)
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宏选择任何非空值。对其余的列执行此操作,并根据您的条件修复连接条件,您应该是金色的。
答案 1 :(得分: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