【问题标题】:Return all records for subquery result in sql在sql中返回子查询结果的所有记录
【发布时间】:2020-06-17 08:36:23
【问题描述】:

我有三个表 products、portfolio_mapping 和 category。每个产品都有多个投资组合映射和多个类别。在以下查询中,我想获取产品所属的所有类别。以下查询仅返回条件为真的类别。当条件为真时,我想拥有产品的所有类别。

我在WHERE 子句中使用了一个子查询,它返回一个product_id。

现在对于这个 product_id,我想获取所有类别。任何想法我在这里做错了什么。

SELECT  c.category_names
FROM 
    product AS pd
LEFT JOIN
    portfolio_mapping AS p
    ON 
    pd.product_id = p.product_id
LEFT JOIN
    category_mapping AS c
    ON 
    pd.product_id = c.product_id  

WHERE pd.product_id IN
    ( SELECT c.product_id FROM category_mapping AS c 
        WHERE (p.portfolio_mapping_id = 1 AND p.value = 'Yes')  
            AND (c.category_id = 1 AND c.value = 'Yes')  )

【问题讨论】:

    标签: mysql sql subquery


    【解决方案1】:

    因为您的子查询引用了主查询中的行,所以您只为某些行生成了 IN 列表。您应该重新编码 where 子句以添加所有相同的连接。

    SELECT  c.category_names
    FROM 
        product AS pd
    LEFT JOIN
        portfolio_mapping AS p
        ON 
        pd.product_id = p.product_id
    LEFT JOIN
        category_mapping AS c
        ON 
        pd.product_id = c.product_id  
    WHERE pd.product_id IN
    ( 
    SELECT c1.product_id FROM product AS pd1
    JOIN portfolio_mapping AS p1 ON pd1.product_id = p1.product_id
    JOIN category_mapping AS c1 ON pd1.product_id = c1.product_id  
    WHERE (p1.portfolio_mapping_id = 1 AND p1.value = 'Yes')  
    AND (c1.category_id = 1 AND c1.value = 'Yes')  
    )
    

    我个人会将其重新编码为使用 WHERE EXISTS ()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多