【问题标题】:Trouble putting together a query with multiple conditions将具有多个条件的查询组合在一起时遇到问题
【发布时间】:2019-04-10 00:06:26
【问题描述】:

我有一个查询库存水平。我需要根据软件中提供的 CustomerID 变量过滤项目。项目和客户之间没有直接连接。但是,我在客户中有自定义字段,它定义了允许他们从哪些项目组购买(布尔值)。我在 Item 中还有一个自定义字段,用于确定它属于哪个组(字符串)。

我尝试使用交叉连接,但正如您所想象的那样,我在右侧得到了空白项目和数据,这是我不想要的。我没有其余的(库存检查)查询,此时我正在尝试根据组获取要为客户显示的项目。我已将实际字段替换为 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

【问题讨论】:

    标签: tsql


    【解决方案1】:

    我使用 case 语句加入了 customer 和 items 表,因为这两个表之间没有直接链接。

    查询

    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语句不正确,找到第一个匹配后停止解析。
    • 你能分享你的查询吗?
    • 查看修改后的查询
    【解决方案2】:

    因此,当 SQL 找到表达式的第一个 '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 有两个组 3 的真实记录。 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多