【问题标题】:multi case selection in a stored procedure存储过程中的多案例选择
【发布时间】:2013-11-11 06:01:02
【问题描述】:
SELECT image_id, 
       CASE image_id 
         WHEN 0 THEN (SELECT image_path 
                      FROM   images 
                      WHERE  image_id IN (SELECT default_image 
                                          FROM   registration 
                                          WHERE  reg_id IN (SELECT favorite_id 
                                                            FROM   @favDT))) 
         ELSE (SELECT image_path 
               FROM   images 
               WHERE  image_id = b.image_id 
                      AND active = 1) 
       END AS image_path 
FROM   buddies b 
WHERE  reg_id IN (SELECT favorite_id 
                  FROM   @favDT) 

我在这个查询中遇到了一个问题,因为select favorite_id from @favDT 在这种情况下返回了许多最喜欢的 id,但我需要获得在来自FROM buddies b where reg_id in (select favorite_id from @favDT) 部分中选择的相同的最喜欢的 id 并使用它case when 0

有什么帮助吗?

【问题讨论】:

    标签: mysql sql sql-server stored-procedures case


    【解决方案1】:

    也许是这样的:

    SELECT image_id, 
           CASE image_id 
             WHEN 0 THEN (SELECT image_path 
                          FROM   images 
                          WHERE  image_id IN (SELECT default_image 
                                              FROM   registration 
                                              WHERE  reg_id IN (SELECT favorite_id 
                                                                FROM   @favDT
                                                                WHERE favorite_id = b.reg_id
                                                               )
                                             )
                         ) 
             ELSE (SELECT image_path 
                   FROM   images 
                   WHERE  image_id = b.image_id 
                          AND active = 1) 
           END AS image_path 
    FROM   buddies b 
    WHERE  reg_id IN (SELECT favorite_id 
                      FROM   @favDT) 
    

    【讨论】:

    • 如果没有选择行,我如何添加案例?
    • 没有从图像中选择行?在这种情况下你想要哪个 image_path?
    • 没有在好友中选择的行在这种情况下需要在image_id为0时进行相同的操作
    • 但在这种情况下,您将从表图像中获取所有图像,这些图像与@favDT 中具有 reg_id 的任何缓冲区无关。在这种情况下,您可以在我的查询后添加UNION ALL SELECT image_id, image_path FROM images WHERE IMAGE_ID NOT IN (SELECT default_image FROM registration WHERE reg_id IN (SELECT favorite_id FROM @favDT WHERE favorite_id = b.reg_id))
    【解决方案2】:

    你需要像下面这样写条件:

    SELECT image_id, 
           CASE image_id 
             WHEN 0 THEN (SELECT image_path 
                          FROM   images 
                          WHERE  image_id IN (SELECT default_image 
                                              FROM   registration 
                                              WHERE  reg_id  = b.reg_id)) 
             ELSE (SELECT image_path 
                   FROM   images 
                   WHERE  image_id = b.image_id 
                          AND active = 1) 
           END AS image_path 
    FROM   buddies b 
    WHERE  reg_id IN (SELECT favorite_id 
                      FROM   @favDT) 
    

    【讨论】:

      【解决方案3】:

      不带 CASE 试试这个:

      SELECT b.image_id,
             im.image_path as image_path
      FROM buddies b 
      JOIN @favDT fdt on b.reg_id=fdt.favorite_id
      JOIN images im on (b.image_id<>0 and b.image_id=im.image_id and active=1) 
                        OR
                        (b.image_id=0 and r.default_image=im.image_id)
      
      LEFT JOIN registration r on (b.image_id=0 and fdt.favorite_id=r.reg_id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 2015-04-01
        相关资源
        最近更新 更多