2

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

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

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

第二个表有两列,它在自己的动物列上连接到参数 = "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
4

2 回答 2

6

听起来您当前的查询正在使用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

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

SQL 连接的可视化解释

于 2012-09-28T10:11:23.217 回答
1

两种选择。

首先使用子查询:

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) 上进行了测试。

于 2012-09-28T10:28:21.110 回答