0

my_tableには4つの列があります。id integer, value integer, value2 integer, name character varying

次のようなすべてのレコードが必要です。

  1. 名前が「a_name」であるレコードと同じvalue2を持っている
  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結合を使用してこのクエリを単純化することは可能ですか?

同じテーブルに参加することは、私の心の中でまだあまりにも複雑です。そして、私はこの例で理解しようとします。

私がこれまでに試みたのは、重複でいっぱいの結果です。

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');
4

4 に答える 4

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
于 2013-03-23T06:05:02.827 に答える
1

「SELECTdistinctt2.id...」を呼び出すと、いつでも明確な結果を得ることができます。

ただし、それでは内部結合の理解が深まりません。よろしければ、読み続けてください。name='a_name'のすべてのレコードを取得することから始めましょう。

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

内部結合を実行する簡単な方法は、上記のクエリの結果が、正式にはリレーションと呼ばれるさらに別のテーブルであることを理解することです。同じテーブルに参加することと考えることができますが、より簡単な方法は「このクエリの結果に参加する」ことです。これを試してみましょう。

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'と'other'の間の内部結合はそれらの外積のサブセットであるため、2番目のクエリが重複する可能性が高くなります。 。

編集:文法、明快さ

于 2013-03-23T06:08:17.940 に答える
1

内部結合の代わりに自己結合を使用する必要があります 。http://msdn.microsoft.com/en-us/library/ms177490%28v=sql.105%29.aspxを参照してください。

于 2013-03-23T06:08:56.133 に答える
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
于 2013-03-23T06:01:13.553 に答える