SQL, возвращая логику значения, находящегося в другом запросе к полю - PullRequest
0 голосов
/ 17 июля 2009

Это мой запрос, как сейчас. Я хочу добавить еще один столбец к проверке результата, если ItemID равен любому значению в другом столбце таблицы (BuildComponents.ComponentID). Например. писать «Y», если его там, и «N», если его нет. Я не хочу, чтобы это влияло на то, какие строки возвращаются. Я использую MS SQL 2005. Логика будет выглядеть примерно так:

if (ItemID находится в (выберите ComponentID из BuildComponents) вернуть '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 ]

2 голосов
/ 17 июля 2009

Способ сделать это - оставить левое соединение с целевой таблицей, и если столбец нулевой, тогда это '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 голосов
/ 17 июля 2009
case when exists (select ComponentID from BuildComponents where ComponentID = i.ItemID) then 'Y' else 'N' end
0 голосов
/ 17 июля 2009
CASE WHEN EXISTS(SELECT * FROM BuildComponents bc WHERE bc.ComponentID = i.ItemID) THEN 'Y' ELSE 'N' END

Должен сделать свое дело.

EXISTS - эффективный способ сделать это, независимо от того, есть ли в BuildComponents несколько записей для идентификатора или нет, он останавливается, как только обнаруживает существование первой.

0 голосов
/ 17 июля 2009
SELECT  'Item' AS type,
        …,
        COALESCE(
        (
        SELECT  TOP 1 'Y'
        FROM    BuildComponents bc
        WHERE   ComponentID = ItemID
        ), 'N'
        )
FROM    Items i,
        …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...