#tsql
#tsql
Вопрос:
У меня есть запрос, который проверяет уровни запасов. Мне нужно отфильтровать элементы на основе переменной CustomerID, указанной в программном обеспечении. Между элементами и клиентами нет прямого соединения. Однако у меня есть пользовательские поля в клиентах, которые определяют, какие группы товаров им разрешено покупать (логическое значение). У меня также есть настраиваемое поле в элементе, которое определяет, к какой группе оно принадлежит (строка).
Я попытался использовать перекрестное соединение, но, как вы можете видеть, я получил пустые элементы и данные справа, чего я не хотел. У меня нет остальной части запроса (проверка запасов), на данный момент я пытаюсь получить товары для показа Клиенту на основе групп. Я заменил фактические поля на Group1, Group2 и т.д. Пожалуйста, не обращайте внимания на скобки.
SELECT Customers.CustomerNo,
Customers.CustomerID,
Customers.Name,
CASE
WHEN Customers.[Group1] = 1
AND Items.UserDefined1 = 'Group1'
THEN Items.ItemNo
WHEN Customers.Group2 = 1
AND Items.UserDefined1 = 'Group2'
THEN Items.ItemNo
WHEN Customers.[Group3] = 1
AND Items.UserDefined1 = 'Group3'
THEN Items.ItemNo
WHEN Customers.[Group4] = 1
AND Items.UserDefined1 = 'Group4'
THEN Items.ItemNo
WHEN Customers.Group5 = 1
AND Items.UserDefined1 = 'Group5'
THEN Items.ItemNo
WHEN Customers.[Group6] = 1
AND Items.UserDefined1 = 'Group6'
THEN Items.ItemNo
WHEN Customers.[Group7] = 1
AND Items.UserDefined1 = 'Group7'
THEN Items.ItemNo
WHEN Customers.[Group8] = 1
AND Items.UserDefined1 = 'Group8'
THEN Items.ItemNo
WHEN Customers.[Group9] = 1
AND Items.UserDefined1 = 'Group9'
THEN Items.ItemNo
WHEN Customers.Group10 = 1
AND Items.UserDefined1 = 'Group10'
THEN Items.ItemNo
WHEN Customers.Group11 = 1
AND Items.UserDefined1 = 'Group11'
THEN Items.ItemNo
ELSE ''
END AS ItemNo,
Items.Name AS Description,
Items.UserDefined1
FROM
(
SELECT Items_1.ItemNo,
Items_1.Name,
ItemsUserDefined.UserDefined1
FROM dbo.Items AS Items_1
INNER JOIN
(
SELECT UserDefined1,
OwnerID
FROM dbo.AdditionalInfo
WHERE(ModuleID = 12)
) AS ItemsUserDefined ON Items_1.ItemID = ItemsUserDefined.OwnerID
) AS Items
CROSS JOIN
(
SELECT Customers_1.CustomerNo,
Customers_1.Name,
Customers_1.CustomerID,
CustomerUserDefined.[Group1],
CustomerUserDefined.Group2,
CustomerUserDefined.[Group3],
CustomerUserDefined.[Group4],
CustomerUserDefined.Group5,
CustomerUserDefined.[Group6],
CustomerUserDefined.[Group7],
CustomerUserDefined.[Group8],
CustomerUserDefined.[Group9],
CustomerUserDefined.Group10,
CustomerUserDefined.Group11
FROM dbo.Customers AS Customers_1
INNER JOIN
(
SELECT UserDefined9 AS [Group1],
UserDefined10 AS Group2,
UserDefined11 AS [Group3],
UserDefined12 AS [Group4],
UserDefined13 AS Group5,
UserDefined14 AS [Group6],
UserDefined15 AS [Group7],
UserDefined16 AS [Group8],
UserDefined17 AS [Group9],
UserDefined18 AS Group10,
UserDefined20 AS Group11,
OwnerID
FROM dbo.AdditionalInfo AS AdditionalInfo_1
WHERE(ModuleID = 38)
) AS CustomerUserDefined ON Customers_1.CustomerID = CustomerUserDefined.OwnerID
) AS Customers
WHERE CustomerID = 472
Ответ №1:
Я присоединился к таблице customer и items, используя оператор case, поскольку между этими двумя таблицами нет прямой связи.
Запрос
select items.name,customers.customerID, items.userdefined1
from customers
inner join Items on items.userdefined1 = (case when customers.group1 =1 then 'group1'
when customers.group2 =1 then 'group2'
when customers.group3 =1 then 'group3'
when customers.group4 =1 then 'group4'
when customers.group5 =1 then 'group5'
end )
Вывод
Комментарии:
1. Мне потребовалась минута, чтобы понять, куда это вписать, но я понял это. Спасибо!
2. Ну, оператор case неверен, он прекращает синтаксический анализ после того, как находит первое совпадение.
3. можете ли вы поделиться своим запросом?
4. см. Измененный запрос
Ответ №2:
Таким образом, SQL прекратит синтаксический анализ, когда найдет первое значение ‘TRUE’ выражения. Мне нужно, чтобы он возвращал ВСЕ значения true.
SELECT CustomerNo,
CustomerID,
Items.ItemNo,
Items.Name AS Description
FROM
(
SELECT Customers_1.CustomerNo,
Customers_1.Name,
Customers_1.CustomerID,
CustomerUserDefined.[Group1],
CustomerUserDefined.Group2,
CustomerUserDefined.[Group3],
CustomerUserDefined.[Group4],
CustomerUserDefined.Group5,
CustomerUserDefined.[Group6],
CustomerUserDefined.[Group7],
CustomerUserDefined.[Group8],
CustomerUserDefined.[Group9],
CustomerUserDefined.Group10,
CustomerUserDefined.Group11
FROM dbo.Customers AS Customers_1
INNER JOIN
(
SELECT UserDefined9 AS [Group1],
UserDefined10 AS Group2,
UserDefined11 AS [Group3],
UserDefined12 AS [Group4],
UserDefined13 AS Group5,
UserDefined14 AS [Group6],
UserDefined15 AS [Group7],
UserDefined16 AS [Group8],
UserDefined17 AS [Group9],
UserDefined18 AS Group10,
UserDefined20 AS Group11,
OwnerID
FROM dbo.AdditionalInfo AS AdditionalInfo_1
WHERE(ModuleID = 38)
) AS CustomerUserDefined ON Customers_1.CustomerID = CustomerUserDefined.OwnerID
) AS Customers
INNER JOIN
(
SELECT Items_1.ItemNo,
Items_1.Name,
ItemsUserDefined.UserDefined1
FROM dbo.Items AS Items_1
INNER JOIN
(
SELECT UserDefined1,
OwnerID
FROM dbo.AdditionalInfo
WHERE(ModuleID = 12)
) AS ItemsUserDefined ON Items_1.ItemID = ItemsUserDefined.OwnerID
) AS Items ON Items.UserDefined1 = (CASE
WHEN Customers.[Group1] = 1
THEN 'Group1'
WHEN Customers.Group2 = 1
THEN 'Group2'
WHEN Customers.[Group3] = 1
THEN 'Group3'
WHEN Customers.[Group4] = 1
THEN 'Group4'
WHEN Customers.Group5 = 1
THEN 'Group5'
WHEN Customers.[Group6] = 1
THEN 'Group6'
WHEN Customers.[Group7] = 1
THEN 'Group7'
WHEN Customers.[Group8] = 1
THEN 'Group8'
WHEN Customers.[Group9] = 1
THEN 'Group9'
WHEN Customers.Group10 = 1
THEN 'Group10'
WHEN Customers.Group11 = 1
THEN 'Group11'
END)
WHERE CustomerID = 578;
Ответ №3:
В приведенном ниже примере у клиента 124 есть две истинные записи для group3. Оператор Case возвращает обе записи.
select items.name,customers.customerID, items.userdefined1
from customers
inner join Items on items.userdefined1 = (case when customers.group1 =1 then 'group1'
when customers.group2 =1 then 'group2'
when customers.group3 =1 then 'group3'
when customers.group4 =1 then 'group4'
when customers.group5 =1 then 'group5'
end )
Я изменил приведенный ниже запрос. Вместо прямого использования оператора case я использовал его как подзапрос для выборки Items.UserDefined1
. Не удалось выполнить запрос, поскольку у меня нет таблицы AdditionalInfo
.
Попробуйте это,
SELECT CustomerNo,
CustomerID,
Items.ItemNo,
Items.Name AS Description
FROM
(
SELECT Customers_1.CustomerNo,
Customers_1.Name,
Customers_1.CustomerID,
CustomerUserDefined.[Group1],
CustomerUserDefined.Group2,
CustomerUserDefined.[Group3],
CustomerUserDefined.[Group4],
CustomerUserDefined.Group5,
CustomerUserDefined.[Group6],
CustomerUserDefined.[Group7],
CustomerUserDefined.[Group8],
CustomerUserDefined.[Group9],
CustomerUserDefined.Group10,
CustomerUserDefined.Group11
FROM dbo.Customers AS Customers_1
INNER JOIN
(
SELECT UserDefined9 AS [Group1],
UserDefined10 AS Group2,
UserDefined11 AS [Group3],
UserDefined12 AS [Group4],
UserDefined13 AS Group5,
UserDefined14 AS [Group6],
UserDefined15 AS [Group7],
UserDefined16 AS [Group8],
UserDefined17 AS [Group9],
UserDefined18 AS Group10,
UserDefined20 AS Group11,
OwnerID
FROM dbo.AdditionalInfo AS AdditionalInfo_1
WHERE(ModuleID = 38)
) AS CustomerUserDefined ON Customers_1.CustomerID = CustomerUserDefined.OwnerID
) AS Customers
INNER JOIN
(
SELECT Items_1.ItemNo,
Items_1.Name,
ItemsUserDefined.UserDefined1
FROM dbo.Items AS Items_1
INNER JOIN
(
SELECT UserDefined1,
OwnerID
FROM dbo.AdditionalInfo
WHERE(ModuleID = 12)
) AS ItemsUserDefined ON Items_1.ItemID = ItemsUserDefined.OwnerID
) AS Items ON Items.UserDefined1 in(select items.userdefined1
from customers
inner join Items on items.userdefined1 = (case when customers.group1 =1 then 'group1'
when customers.group2 =1 then 'group2'
when customers.group3 =1 then 'group3'
when customers.group4 =1 then 'group4'
when customers.group5 =1 then 'group5'
end ))
WHERE CustomerID = 578;