2017-02-13 60 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