2017-10-13 65 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

相關問題