如何在SQL中获取匹配的列对

时间:2013-12-17 23:32:53

标签: sql join

我不是SQL专家,但我说我有一张桌子

ID    Col A   Col B
id    a1      b1
id1   a2      b2
id2   a3      b3
id3   a4      b4
id4   a1      b5

我想获取与某些列对匹配的所有行的ID。例如,我想要匹配(a1,b1)和(a3,b3)的行应该返回id,id3。

在linq 2中执行此操作SQL使用for循环和某种键值对集合会很简单。 不过这是我到目前为止的SQL

    Select * from [MyTable]  WHERE (ColA in ('a1','a3') AND  ColB in ('b1','b3'))

这将返回比我要求的更大的子集,特别是它将包括非精确对匹配,如第5行(id4)。

我知道这需要某种自我加入,但我需要一些帮助。

2 个答案:

答案 0 :(得分:1)

您是否尝试将其拆分为明确的比较:

SELECT *
  FROM [MyTable]
 WHERE (ColA = 'a1' AND ColB = 'b1')
    OR (ColA = 'a3' AND ColB = 'b3')

答案 1 :(得分:1)

像GamerJosh一样分裂可能是最简单的方法。另一种方法是在子查询中构建一个包含值的表:

http://sqlfiddle.com/#!2/6ca02/4/0

查询1

select t.*
from t
inner join (
  select 'a1' as cola, 'b1' as colb
  union
  select 'a3','b3'
) vals on vals.cola=t.cola and vals.colb=t.colb

<强> [结果]

|  ID | COLA | COLB |
|-----|------|------|
|  id |   a1 |   b1 |
| id2 |   a3 |   b3 |

此外,根据您正在使用的数据库,您可以将该子查询放在查询开头的公用表表达式中。

如果您使用的是Oracle,则可以执行类似

的操作
select * from mytable where (cola,colb) in (('a1','b1'),('a3','b3'))