我不是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)。
我知道这需要某种自我加入,但我需要一些帮助。
答案 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'))