2013-03-23 39 views
0

my_table有4列:id integer, value integer, value2 integer, name character varying如何用sql連接簡化這個查詢?

我希望所有的記錄:

  1. 具有相同的值2作爲其名稱是「a_name」
  2. 有一個字段值不及的一個記錄記錄其名稱是「a_name」

而且我有以下查詢令人滿意的結果:

select t.id 
from my_table as t 
where t.value < (select value from my_table where name = 'a_name') 
and s.value2 = (select value2 from my_table where name = 'a_name'); 

但是是否可以使用sql連接來簡化此查詢?

加入同一張桌子在我腦海中依然過於複雜。我試圖通過這個例子來理解。

我發生至今想什麼,是一個充滿dupplicates結果:

select t2.id 
from my_table as t 
inner join my_table as t2 on t2.value2 = t.value2 
where t2.value < (select value from my_table where name = 'a_name'); 
+1

在第一查詢看,它看起來像每個組具有相同值2的記錄,它消除最大't.value'的記錄?如果您在表格中顯示示例數據,然後顯示示例期望的結果,那將會很好。 – AaronLS 2013-03-23 05:59:38

回答

2

我認爲這將解決您的問題。

select t1.id 
from my_table as t1 
join my_table as t2 
    on t1.value2 = t2.value2 
    and t2.name = 'a_name' 
    and t1.value < t2.value 
0

請儘量將

select t.id 
from my_table as t 
inner join 
(select value from my_table where name = 'a_name')t1 on t.value<t1.value 
inner join 
(select value2 from my_table where name = 'a_name')t2 on t.value2=t2.value2 
1

你總是可以通過調用得到不同的結果「SELECT DISTINCT t2.id ......」

然而,這不會提高您的內部連接的理解。如果你願意,請繼續閱讀。我們首先獲取名稱爲'a_name'的所有記錄。

SELECT a.* 
FROM my_table as a 
WHERE a.name = 'a.name'; 

一個更簡單的執行你的內部聯接方式是瞭解以上查詢的結果是另一個表,正式名稱是relation。您可以將其視爲加入同一張表,但更容易想到的方式是「加入此查詢的結果」。讓我們把這個測試。

SELECT other.id 
FROM my_table as a, 
INNER JOIN my_table as other ON other.value2 = a.value2 
WHERE a.name = 'a_name' 
AND other.value < a.value; 

如果第一次查詢(與名=「a_name」中的所有行),有很多結果,你站在有重複第二次查詢的一個很好的機會,因爲內部的別名「a」和「其他」之間的連接是其cross product的子集。

編輯:語法,清晰