【问题标题】:SQL to return product and product dependencies返回产品和产品依赖关系的 SQL
【发布时间】:2015-09-09 15:11:31
【问题描述】:

我有一张表 (product),其中列出了所有产品。我有另一个表 (product_buddy),它是依赖关系的映射。

我已经设置了一个简单的SQLFiddle

在小提琴中,有 3 种产品:foo、bar、baz。 product_buddy 中还有一行,其中 baz 是 foo 的依赖项。所以如果我SELECT foo,我希望它也能返回 baz。但是如果我SELECT bar,它没有依赖关系,所以它应该只返回 bar。与 baz 相同,它没有依赖项,因此它应该只返回自身。在这个小提琴中只有 foo 应该返回两行。

连接只会将其连接成一行,这不是我想要的,我想要两行,每个产品的代码和名称字段。当我说两行时,如果我SELECT foo,由于依赖关系,它应该返回 foo 行和 baz 行:

# SQL without missing join/binding of dependency:
SELECT code,name FROM product WHERE product.code = "foo";

| code | name        |
|------|-------------|
| foo  | Foo Product |
| baz  | Baz Product |

如果我这样做,结果是一样的:

SELECT code,name FROM product WHERE product.code IN ("foo", "baz");

但我不提前知道依赖关系。我需要 SQL 来找出依赖关系。我可以编辑 product_buddy 表,product 表需要保持不变。

【问题讨论】:

  • 你能发布你想要的结果吗?
  • 即使建议使用 SqlFiddle 来帮助描述问题,您也应该尝试在此处提供大部分信息,以防外部链接丢失。
  • 添加了一个示例响应,当我检索 foo 产品时,由于product_buddy 表中定义的依赖关系,我需要它返回 foo 和 baz 行。

标签: mysql sql join


【解决方案1】:

SQL FIDDLE DEMO

SELECT
    p.*
FROM product p
WHERE p.code = "foo" 

UNION

SELECT
    p.*
FROM product_buddy b           
INNER JOIN product p
   on b.buddy_code = p.code
WHERE b.product_code = "foo" 

结果

id  code    name
1   foo     Foo Product
3   baz     Baz Product

【讨论】:

    【解决方案2】:

    试试这个

    WITH dep (dependencies) AS 
        (SELECT buddy_code 
         FROM product_buddy
         WHERE product_code = code_searched)
    SELECT code, name
    FROM product
    WHERE code in dep.dependencies OR code = code_searched
    

    编辑:

    显然 MySQL 不支持 WITH 子句:S

    select code, name
    from product
    where product.code = "foo" 
        OR product.code IN (SELECT buddy_code 
                            FROM product_buddy
                            WHERE product_buddy.product_code = "foo")
    

    【讨论】:

    • 我在小提琴中尝试了你的代码但不起作用。:(我将code_searched都替换为“foo”
    • 对不起,我不能尝试,小提琴不适合我
    • 请稍后尝试检查,如果成功请给我留言。泰。
    • 哦,是的,Mysql 对此很傻。但我会在 postgres 或 MSSQL 上测试你的方法,那行 IN dep.dependencies 看起来很有趣。
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多