2014-10-07 46 views
0
選擇不同的酒吧foo的

比方說,我有兩個表:從2個表

Table foo 
=========== 
id | val 
-------- 
01 | 'a' 
02 | 'b' 
03 | 'c' 
04 | 'a' 
05 | 'b' 

Table bar 
============ 
id | class 
------------- 
01 | 'classH' 
02 | 'classI' 
03 | 'classJ' 
04 | 'classK' 
05 | 'classI' 

我想返回FOO的所有值和酒吧,是其中富在多個不同的酒吧存在。因此,在此示例中,我們將返回:

val | class 
------------- 
'a' | 'classH' 
'a' | 'classK' 

因爲儘管'b'也存在多次,它也具有相同的bar值。

我有以下查詢返回的其中有多個酒吧都富,就算了吧是相同的:

select distinct foo.val, bar.class 
from foo, bar 
where foo.id = bar.id 
and 
(
    select count(*) from 
    foo2, bar2 
    where foo2.id = bar2.id 
    and foo2.val = foo.val 
) > 1 
order by 
va.name; 

回答

2
select f.val, b.class 
from foo f 
join bar b on f.id = b.id 
where f.val in (
    select f.val 
    from foo f 
    join bar b on f.id = b.id 
    group by f.val 
    having count(distinct b.class) > 1 
); 
+0

尼斯查詢+1從我:) – 2014-10-07 18:40:14

+0

簡單,我需要什麼。順便說一下,我正在學習一門SQL課程,而我們的老師可以提出疑問,但他們通常需要深入3到4個子查詢並且有很多過剩......您是否使用過任何優秀的材料來編寫查詢? – ironicaldiction 2014-10-07 19:55:47

+0

@ironicaldiction抱歉,沒有任何建議。我通常在網上搜索(通常最終在這裏) – FuzzyTree 2014-10-07 22:14:46

1

你可以使用具有全部重複,以顯示每個子查詢使用EXISTS行像這樣。

SELECT f.val, b.class 
FROM foo f 
JOIN bar b ON b.id = f.id 
WHERE EXISTS 
( SELECT 1 
    FROM foo 
    JOIN bar ON foo.id = bar.id 
    WHERE foo.val = f.val 
    GROUP BY foo.val 
    HAVING COUNT(DISTINCT bar.class) > 1 
); 

Fiddle Demo

普遍存在執行比這就是爲什麼我喜歡它了...更多細節關於VS存在MY POST HERE

1

你可以做一個子查詢,以獲得更快的人口從符合條件(名稱)的foo開始。然後加入回兩個表,以獲得您想要的信息輸出:

select f.val, b.class 
from (select f.val 
     from foo f join 
      bar b 
      on f.id = b.id 
     group by f.val 
     having count(distinct b.class) > 1 
    ) bf join 
    foo f 
    on bf.val = f.val join 
    bar b 
    on f.id = b.id 
1
select f.val, b.class 
    from foo f 
    join bar b 
    on f.id = b.id 
    join (select f.val 
      from foo f 
      join bar b 
      on f.id = b.id 
     group by f.val 
     having count(distinct b.class) > 1) v 
    on b.val = v.val