まず、表示されたクエリがまったく機能せず、サブクエリにありませstudent_id
ん。後でJOINで使用します。
さらに興味深いことに:
セットから特定の行を選択しますDISTINCT
DISTINCT
そしてDISTINCT ON
、列のセットに従ってすべての行を区別するようにソートして、区別できる値を返します。次に、すべてのセットから最初の行を選択します。一般の場合はすべての行でソートし、のDISTINCT
場合は指定された行のみでソートしますDISTINCT ON
。ここに、セットから特定の行を他の行よりも選択する機会があります。
たとえば、例で空でない「mNrPhone」を含む行を使用する場合は、次のようになります。
SELECT DISTINCT ON (a.s_id) -- sure you didn't want a.a_id?
,a.s_id AS a_s_id -- use aliases to avoid dupe name
,s.s_id AS s_s_id
,s."mNrPhone"
,s."dNrPhone"
FROM "Table1" a
JOIN (
SELECT b.s_id, c."mNrPhone", c."dNrPhone", ??.student_id -- misssing!
FROM "Table2" b
JOIN "Table3" c USING (s_id)
WHERE b.a_id = 1001
-- ORDER BY b.last_name -- pointless, DISTINCT will re-order
) s ON a.a_id = s.student_id
WHERE a.k_id = 11211
ORDER BY a.s_id -- first col must agree with DISTINCT ON, could add DESC though
,("mNrPhone" <> '') DESC -- non-empty first
ORDER BY
DISTINCT
同じクエリレベルで異議を唱えることはできません。これを回避するには、GROUP BY
代わりに使用するか、クエリ全体をサブクエリに入れて別のクエリを実行SELECT
しORDER BY
ます。
サブクエリORDER BY
にあったものは無効になります。
この特定のケースでは、(見たところ)重複がサブクエリからのみ発生する場合(検証する必要があります)、代わりに次のことができます。
SELECT a.a_id, s.s_id, s."mNrPhone", s."dNrPhone" -- picking a.a_id over s_id
FROM "Table1" a
JOIN (
SELECT DISTINCT ON (b.s_id)
,b.s_id, c."mNrPhone", c."dNrPhone", ??.student_id -- misssing!
FROM "Table2" b
JOIN "Table3" c USING (s_id)
WHERE b.a_id = 1001
ORDER BY b.s_id, (c."mNrPhone" <> '') DESC -- pick non-empty first
) s ON a.a_id = s.student_id
WHERE a.k_id = 11211
ORDER BY a.a_id -- now you can ORDER BY freely