如果找不到匹配项,如何使列值与查找匹配的简单查询匹配更多列

时间:2014-08-25 23:16:08

标签: sql sql-server

这是我遇到的问题的简化版本。假设我在table1的三列和一个id字段中有三个相同类型的变量。它们都是代码。大多数情况下,它们映射到table2中查找的变量(组标识符说)。我想编写一个执行以下操作的查询:

对于我的每条记录,我想返回table2中的变量,即我匹配table1中三列中第一列中的代码。但是,如果此列中的变量包含table2中没有匹配项的值,我想尝试使用column2进行匹配。如果那个不匹配,请使用column3中的那个。

我希望查询结果包含table1中的ID和table2中的匹配项。如果根本没有匹配,那么我希望查询包含一个id为n / a的行。

在此示例中,我的查找中只有两个值匹配。我实际上是在12列中映射数百个唯一代码值和数百万行数据。

表1

id  col1    col2    col3
1   V21 G22 T21
2   E30 W21 S34
3   Y11 U29 Q66

表2

cat_code    class_group
V21 group1
W21 group2

查询结果

id  class_group
1   group1
2   group2
3   n/a

因此,在期望的结果中,记录id 1与第一列匹配,并返回相应的变量,第二个记录在第一个列上无法匹配,但在第二列和第三个记录中找到一个不能匹配三列中任何一列中的任何值,因此它会抛出一个n / a。

我对SQL很新 - 我不确定这是否可以通过简单的查询实现,还是需要功能。

3 个答案:

答案 0 :(得分:3)

select t1.id, 
    coalesce(t21.class_group, t22.class_group, t23.class_group) class_group
from Table1 t1
left join Table2 t21 on t21.cat_code = t1.col1
left join Table2 t22 on t22.cat_code = t1.col2
left join Table2 t23 on t23.cat_code = t1.col3

答案 1 :(得分:1)

就像乔尔写的......但他比我快:)

SELECT [Id], COALESCE(C1.[class_group], C2.[class_group], C2.[class_group], 'N/A')
FROM Table1 AS T1
  LEFT JOIN Table2 AS C1 ON C1.[cat_code] = T1.[col1]
  LEFT JOIN Table2 AS C2 ON C2.[cat_code] = T1.[col2]
  LEFT JOIN Table2 AS C3 ON C3.[cat_code] = T1.[col3]

http://sqlfiddle.com/#!6/ffb01/3

答案 2 :(得分:0)

试试这个SQL查询:

SELECT table1.id, table2.class_group
FROM table1
INNER JOIN table2 ON table1.col1 = table2.cat_code
UNION
SELECT table1.id, table2.class_group
FROM table1
INNER JOIN table2 ON table1.col2 = table2.cat_code
SELECT table1.id, table2.class_group
FROM table1
INNER JOIN table2 ON table1.col3 = table2.cat_code
相关问题