2017-02-13 32 views
0

我有一个数据库,我想同时查询多个值(用于prestanda目的)。我想发送一个IN子句并获取匹配行的列表以及它们等效的IN子句值作为回报。对此,我想保留的顺序在IN子句如何确定匹配的IN子句中的极限值

查询模板:

select id 
    from mytable 
    where id in (select id from myalias where alias in ('alias a', 'alias b') 
    and name = 'name 1' or name = 'name 2' ; 

我怎么知道哪些行(ID)的结果是“名字1”和“名称2'?

这可能实现没有太多的忙碌?

得到的表:

id | alias 
----------- 
2 | alias a 
1 | alias b 

注意:如果IN-子句顺序被保持在结果表中,别名柱可以ommitted

myalias:

id | alias 
------------- 
1 | alias b 
1 | alias d 
2 | alias a 
3 | alias z 

myTable:

id | name 
----------- 
1 | name 1 
2 | name 2 
3 | name 2 
+2

选择MyOtherValue,MyValue ...应该做它没有? –

+0

除了@JoeC的建议,使用'DISTINCT'和'ORDER BY'类。 –

+0

@FredrickGauss,你如何建议SELECT DISTINCT和ORDER BY? – jarlh

回答

0

这是你想要的吗?

SELECT myValue, v.val 
FROM myTable t LEFT JOIN 
    (VALUES ('o1'), ('o2'), ('o3'), ('o4')) v(val) 
    ON t.myOtherValue = v.val; 

我感到那你也可以这样做:

SELECT myValue, 
     (CASE WHEN myOtherValue IN ('o1', 'o2', 'o3', 'o4') 
      THEN myOtherValue 
     END) as val 
FROM myTable t; 

匹配的值是myOtherValue已经存在。

+2

你确定第一个查询语法正确吗?那第二个左连接看起来很麻烦。 –

+0

@DanBracuk。 。 。谢谢。 –

0

这是你想要的吗?将名称添加到选择列表可让您知道哪个名称与哪个ID匹配。加入取代在哪里在...

select name, id 
    from mytable m 
    join (select id from myalias where alias in ('alias a', 'alias b') a on m.id = a.id 
    where name = 'name 1' or name = 'name 2' ; 
+0

我不认为IN子句中的值的顺序是这样保留的。 – Fontanka16