【问题标题】:SQL joining tables only on specific rowsSQL 仅在特定行上连接表
【发布时间】:2012-09-27 22:14:01
【问题描述】:

我正在寻找关于如何做到这一点的心态的一般回应...... 我有一个表,其中有一列满是可能的参数,一列满是可能的值。我想将某种类型的所有参数连接到另一个表以进一步描述这些特定行,但不将该表连接到不包含特定值的所有其他行。它看起来像这样:

Parameters  Values   Mammal
   a          1         
   b          3
   d         cat      Yes
   c          4
   d         dog      Yes
   e          3
   d         fish      No
   f          2

我尝试了多种使用 Case 的方法,但是表格变得非常奇怪,并且根据表格的长度,表格会重复连接。有什么建议吗?

第二个表有两列,它在自己的动物列上连接到 parameter = "d" 的值列。当参数等于其他任何值时,它根本不显示。任何建议将不胜感激! (如果您需要知道,我正在使用缓存 SQL。不过,我更希望对技术进行一般性解释,它会更有帮助。)

编辑:对不起,这将是两个单独的表:

      Table 1:                                   Table 2:

Parameters  Values                           Animal      Mammal
    a        1                                 cat         yes
    b        3                                 dog         yes
    d        cat                              snake        no
    c        4                                fish         no
    d        dog                               rat         yes
    e        3                               hamster       yes
    d        fish
    f        2

【问题讨论】:

  • 上表是第一个还是第二个表还是预期的输出。我已经重读了几次你的问题,但我无法弄清楚。您能否澄清一下您的表结构是什么以及您期望的输出是什么。
  • 请张贴一些您的两个分开的表格的数据示例,以及预期的结果

标签: sql


【解决方案1】:

听起来您当前的查询正在使用INNER JOIN,它只会包含两个表中匹配的记录。您需要使用LEFT JOIN,它将生成来自table1 的所有记录以及table2 中的匹配记录。如果没有来自 table1 的匹配项,则缺失的一方将等于 null:

select t1.parameters,
  t1.value,
  case when t2.mammal is null then '' else t2.mammal end Mammal
from table1 t1
left join table2 t2
  on t1.value = t2.animal

SQL Fiddle with Demo

如果您在学习 JOIN 语法方面需要帮助,这里有一篇很棒的文章:

A Visual Explanation of SQL Joins

【讨论】:

    【解决方案2】:

    两个选项。

    首先使用子查询:

    select [parameters], [values], 
        (select mammal from t2 where t2.animal = t1.[values]) as mammal
    from t1
    

    第二次使用左连接。

    select [parameters], [values], t2.mammal
    from t1
    left join t2 on t1.[values] = t2.animal
    

    另一个答案使用左连接,但跳过另一个答案提供的空替换。

    请注意,这仅在 MS SQL Server (T-SQL) 上进行了测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多