2013-04-13 63 views
-2

我想要做這樣的事情:'in(select ...)'語句的多個變量?

 
select value1, value2, value3, value4, count(1) 
from mytable 
where value1, value2, value3, value4 in 
    (select value1, value2, value3, value4 from mytable 
    where record_no = 1 and value5 = 'foobar') 
group by value1, value2, value3, value4 
having count(1)>4; 

也就是說,我想找到values1-4爲1-4那些對他們的記錄ATLEAST一個特定屬性的所有羣體,我想只有那些有四個以上記錄的組。

更新澄清

 
select * from mytable; 

會給你像

 
value1 value2 value3 value4 record_no value5 lots more columns 
------ ------ ------ ------ --------- ------ ----------------- 
aaa  bbb  ccc  ddd  1   foobar 
aaa  bbb  ccc  ddd  2   abcdef 
aaa  bbb  ccc  ddd  3   zzzzzz 
aaa  bbb  ccc  ddd  4   barfoo 
aaa  bbb  ccc  ddd  5   dsnmatr 
a1  b1  c1  d1  1   foobar 
a1  b1  c1  d1  2   foobar 
a2  b2  c2  d2  1   barfoo 
a2  b2  c2  d2  2   barfoo 

我想找到值1,值2,值3的值,VALUE4 VALUE1的所有羣體,值2,值3,值4,其記錄1具有'foobar'作爲其值5,並且組大小> 4。

例如,它應該返回

 
value1 value2 value3 value4 
------ ------ ------ ------ 
aaa  bbb  ccc  ddd
+1

你的例子絕對沒有意義,你的解釋並不十分清楚。你可以[編輯]你的問題,併發布一些樣本數據和你想從這些數據中得到的結果? –

+0

我已更新它。 – dwjohnston

回答

2

你非常接近開始。這部分是問題:

where value1, value2, value3, value4 in 

你必須把value1, value2, value3, value4爲一組,所以只是把括號身邊,像這樣:

where (value1, value2, value3, value4) in 

這裏是整個查詢;從您的文章改變的唯一事情就是括號:

select value1, value2, value3, value4, count(1) 
from mytable 
where (value1, value2, value3, value4) in 
    (select value1, value2, value3, value4 
    from mytable 
    where record_no = 1 and value5 = 'foobar') 
group by value1, value2, value3, value4 
having count(1) > 4; 

有此here的SQL小提琴。

0

當使用多個變量,我經常串聯的項目與不發生的一些人物在一起,所以

where value1 + '|' + value2 + '|' + value3 in (
    select value1 + '|' + value2 + '|' + value3 from ... 

如果我有三個字段。如果所有的價值觀都是相同的,那麼平等只會是真的,達到結果。

+0

這個解決方案的問題是,它變成了一個非常昂貴的字符串比較操作? – dwjohnston

+0

它可能很慢,但是像Microsoft SQL Server不提供多值'in'子句比較,所以你可以做你需要做的事情。我錯過了Oracle標籤。這是爲什麼在T-SQL中我傾向於在複雜連接表上添加一個可能需要這樣一個查詢的合成關鍵字:我可以通過合成關鍵字進行連接並索引候選關鍵字,從而避免這樣的結構。 – Godeke

0

,你可以做這樣的

select value1, value2, value3, value4, count(*) 
from mytable 
group by value1, value2, value3, value4 
having count(*) > 4 
and  sum(decode(record_no , 1 , 1 , 0)) = 1 
and  sum(decode(value5 , 'foobar' , 1 , 0) = 1; 

這是一個小動作與解碼。它應該可以正常工作。

出於教育目的,如果你不需要和子查詢(這是你的情況)的實際數據,總是使用EXISTS是個好主意。 在你的例子中它會是

select value1, value2, value3, value4, count(*) 
from mytable 
where exists 
    (select 1 
    from mytable b 
    where b.record_no = 1 
    and b.value5 = 'foobar' 
    and b.value1 = a.value1 
    and b.value2 = a.value2 
    and b.value3 = a.value3 
    and b.value4 = a.value4 
    ) 
group by value1, value2, value3, value4 
having count(1) > 4;