2009-07-17 6 views
0

これは今の私のクエリです。 ItemIDが別のテーブルの列(BuildComponents.ComponentID)の値と等しい場合、結果のチェックに別の列を追加します。例えば。その場合は 'Y'を、そうでない場合は 'N'を書きます。私はこれが返される行に影響を与えたくありません。アイテムIDが 'Y' 他 リターン(BuildComponentsからのComponentIDを選択) リターンで 'N'フィールドの別のクエリにある値の論理を返すSQL

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

これを行う方法は、ターゲット表に左結合することです。列がNULLの場合は 'N'、それ以外の場合は 'Y'にcase文を指定します。

ただし、BuildComponentsでComponentIDが一意でない場合は、予想よりも多くの結果が得られる可能性があります。そのため、別のサブクエリが必要です。あなたの参加一覧へ

あなたの選択フィールドに

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 
です(場合

:私は、ロジックはこのようなものになるだろうMS SQL 2005を使用しています

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ですそのIDのためのBuildComponentsに複数のレコードがある場合でも、最初のレコードの存在を検出するとすぐに停止します。

関連する問題