2009-07-17 73 views
0

這是我的查詢,因爲它是現在。如果ItemID等於另一個表列(BuildComponents.ComponentID)中的任何值,我想向結果檢查中添加另一列。例如。如果它在那裏寫'Y',否則寫'N'。我不希望這會影響返回的行。我使用MS SQL 2005的邏輯是這樣的:SQL,將值邏輯返回到另一個查詢字段

如果(項目ID是(從BuildComponents選擇的ComponentID) 回報 'Y' 其他 回報 'N'

SELECT 
'Item' AS type, 
i.ItemID, 
i.ItemNumber AS prodid, 
i.ItemName AS 'desc', 
i.SellUnitMeasure AS unit, 
i.SellUnitQuantity AS quantity, 
i.VATExclusiveStandardCost AS pricein, 
i.BaseSellingPrice AS priceout, 
v1.VATPercentageRate AS vatRateIn, 
1 AS vatTypeIn, 
v1.VATCode AS VATCodeIn, 
v1.VATCodeDescription AS VATCodeDescriptionIn, 
v2.VATPercentageRate AS vatRateOut, 
2 AS vatTypeOut, 
v2.VATCode AS VATCodeOut, 
v2.VATCodeDescription AS VATCodeDescriptionOut, 
i.IsInactive AS inactive, 
s.CardRecordID AS VendID, 
i.SupplierItemNumber AS VendCode, 
i.VATExclusiveStandardCost AS VendInPrice, 
i.ItemDescription AS ProductNote, 
i.CustomField1, 
i.CustomField2, 
i.CustomField3, 
cl1.CustomListText AS CustomField4, 
cl1.CustomListName AS CustomField4Name, 
cl2.CustomListText AS CustomField5, 
cl2.CustomListName AS CustomField5Name, 
cl3.CustomListText AS CustomField6, 
cl3.CustomListName AS CustomField6Name, 
'' AS QuantityOnHand, 
'' AS LocationName, 
i.PriceIsInclusive, 
i.ItemIsStocked, 
ISNULL(l1.LocationName, ISNULL(l2.LocationName, 'Default Warehouse')) AS DefaultLocation, 
i.PositiveAverageCost as cost 
FROM Items i 
LEFT JOIN ItemLocations il ON il.ItemID = i.ItemID AND il.ItemID IS NULL 
LEFT JOIN VATCodes v2 ON v2.VATCodeID = i.SellVATCodeID 
LEFT JOIN VATCodes v1 ON v1.VATCodeID = i.BuyVATCodeID 
LEFT JOIN Suppliers s ON s.SupplierID = i.PrimarySupplierID 
LEFT JOIN CustomLists cl1 ON cl1.CustomListID = i.CustomList1ID 
LEFT JOIN CustomLists cl2 ON cl2.CustomListID = i.CustomList2ID 
LEFT JOIN CustomLists cl3 ON cl3.CustomListID = i.CustomList3ID 
LEFT JOIN Locations l1 ON l1.LocationID = i.DefaultSellLocationID 
LEFT JOIN Locations l2 ON l2.LocationID = 1 

回答

2

要做到這一點的方法是左連接到目標表,如果列爲空,那麼它是'N',否則'Y'與case語句。

但是,如果ComponentID在BuildComponents中不唯一,則可能會得到比預期更多的結果,因此您需要一個明確的子查詢來阻止該情況的發生。

爲了您的加入列表中添加

LEFT JOIN (SELECT DISTINCT ComponentID FROM BuildComponents) BC ON BC.ComponentID = i.ItemID 

要你選擇字段,你需要添加另一列,

CASE WHEN BC.ComponentID IS NULL THEN 'N' ELSE 'Y' END as MyColName 
2
case when exists (select ComponentID from BuildComponents where ComponentID = i.ItemID) then 'Y' else 'N' end 
0
SELECT 'Item' AS type, 
     …, 
     COALESCE(
     (
     SELECT TOP 1 'Y' 
     FROM BuildComponents bc 
     WHERE ComponentID = ItemID 
     ), 'N' 
     ) 
FROM Items i, 
     … 
0
CASE WHEN EXISTS(SELECT * FROM BuildComponents bc WHERE bc.ComponentID = i.ItemID) THEN 'Y' ELSE 'N' END 

應該做的伎倆。

EXISTS是EFFIC最好的方法是,如果BuildComponents中有多個記錄,那麼無論它是否存在,都會立即停止,只要它發現第一個存在就停止。

相關問題