SQL,返回值的逻辑在另一个查询到字段

时间:2009-07-17 11:38:09

标签: sql sql-server-2005

这是我现在的查询。我想在结果中添加另一列,检查ItemID是否等于另一个表列(BuildComponents.ComponentID)中的任何值。例如。写'Y'如果它在那里和'N'如果不是。我不希望这会影响返回的行。我正在使用MS SQL 2005.逻辑将是这样的:

if(ItemID在(从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

4 个答案:

答案 0 :(得分:2)

case when exists (select ComponentID from BuildComponents where ComponentID = i.ItemID) then 'Y' else 'N' end

答案 1 :(得分:2)

执行此操作的方法是将连接保留为目标表,如果列为null,则为“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 :(得分:0)

SELECT  'Item' AS type,
        …,
        COALESCE(
        (
        SELECT  TOP 1 'Y'
        FROM    BuildComponents bc
        WHERE   ComponentID = ItemID
        ), 'N'
        )
FROM    Items i,
        …

答案 3 :(得分:0)

CASE WHEN EXISTS(SELECT * FROM BuildComponents bc WHERE bc.ComponentID = i.ItemID) THEN 'Y' ELSE 'N' END

应该做的伎俩。

EXISTS是一种有效的方法,如果ID的BuildComponents中有多条记录并不重要,它会在找到第一条记录时立即停止。