【问题标题】:Check if Values of one column in another column of different table检查一列的值是否在不同表的另一列中
【发布时间】:2019-09-03 16:16:07
【问题描述】:

我是 SQL 新手,对以下情况感到震惊,请任何人帮忙。

我想检查产品的成分是否允许在生产线上使用,如果允许,那么产品的生产线名称可以在哪里生产。

表 1

ProductionLine       Allergen
  BB1          Tree nut
  BB1          Peanut
  BB1           Milk
  BB1           Wheat
  BB2          Tree nut
  BB2          Peanut
  BB2           Milk 
  BB2           soy
  BB2           Egg

表2

Product                Ingredients
P1                 Tree nut
P1                 Peanut
P1                 Milk 
P1                 soy

这里的产品 P1 可以在 BB2 生产线生产,因为所有成分都允许在 BB2 过敏原列表中。所以我想将结果设置为

预期结果

  Product            Ingredients          ProductionLine
  P1                 Tree nut                 BB2
  P1                 Peanut                   BB2
  P1                 Milk                     BB2   
  P1                 soy                      BB2

如果任何一种成分不允许在任何一条生产线上,那么我们就不能在该生产线上生产产品。

【问题讨论】:

    标签: sql sql-server mssql-jdbc


    【解决方案1】:

    假设两个表中没有重复项,您可以使用left joingroup by。关键是计算匹配的数量并确保它与成分的总数匹配。

    select t2.product, t1.productionline
    from (select t2.*,
                 count(*) over (partition by product) as num_products
          from table2 t2
         ) t2 left join
         table1 t1
         on t2.ingredient = t1.allergen
    group by t2.product, t1.productionline, t2.num_products
    having count(t1.ingredient) = num_products;
    

    【讨论】:

    • 谢谢@gordonlinoff,你能帮我得到结果集以包含两个表中的所有列,并将生产线添加为可以生产产品的额外列。
    • 如果这不可能全部放在一起,至少我希望将成分与产品名称一起提供会有所帮助。当我尝试包含成分时,我得到了错误的结果集。
    • @Naveenvadlamudi 。 . .我建议你问一个新问题。这回答了您在此处提出的问题。也就是说,您可以使用string_agg() 收集所有成分/过敏原值,这样就可以满足您的需求。
    【解决方案2】:

    所以,理想情况下,过敏原应该有一些你可以加入的 ID,这样你就可以做类似的事情

    SELECT Table2.Product, Table2.Ingredients, Table1.ProductionLine FROM Table1.AllergenId JOIN Table2.IngredientAllergenId 
    

    如果您的表格不是这样的结构,它们可能应该是这样。但如果你不能改变它,你可以这样做。

    SELECT Table2.Product, Table2.Ingredients, Table1.ProductionLine FROM Table1.Allergen JOIN Table2.Allergen 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-12
      • 2014-01-30
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      相关资源
      最近更新 更多