2
SELECT DISTINCT a.s_id, select2Result.s_id, select2Result."mNrPhone", 
       select2Result."dNrPhone" 
FROM "Table1" AS a INNER JOIN
    (
    SELECT b.s_id, c."mNrPhone", c."dNrPhone" FROM "Table2" AS b, "Table3" AS c  
    WHERE b.a_id = 1001 AND b.s_id = c.s_id
    ORDER BY b.last_name) AS select2Result
ON a.a_id = select2Result.student_id
WHERE a.k_id = 11211 

戻り値:

1001;1001;"";""
1002;1002;"";""
1002;1002;"2342342232123";"2342342"
1003;1003;"";""
1004;1004;"";""

1002 の値は 2 回繰り返されますが、私が使用DISTINCTし、他のテーブルに 2 回繰り返される ID がないため、そうすべきではありません。

4

3 に答える 3

3

次のようにDISTINCT ONを使用できます。

   SELECT DISTINCT ON (a.s_id) 
          a.s_id, select2Result.s_id, select2Result."mNrPhone", 
          select2Result."dNrPhone"
   ...

しかし、他の人があなたに言ったように、「繰り返し記録」は実際には異なります。

于 2012-08-10T12:35:30.180 に答える
2

修飾子 DISTINCT は、select-list の最初の列ではなく、行全体に適用されます。列 3 と 4 (mNrPhonedNrPhone) は の 2 つの行で異なるため、s_id = 1002DBMS は両方の行を正しく一覧表示します。を 1 回だけ表示する場合は、別の方法でクエリを作成するs_id = 1002必要があり、どの補助データを表示するかを決定する必要があります。

余談ですが、すべてのクエリとサブクエリで明示的な JOIN 表記 (SQL-92 で導入された) を常に使用することを強くお勧めします。古い暗黙の結合表記法 (SQL-86 または SQL-89 で使用できるのはこれだけです) を使用しないでください。メインクエリは明示的な結合を使用します)。古いクエリを理解するには、古い表記法を知る必要があります。新しいクエリは新しい表記法で書く必要があります。

于 2012-08-10T12:13:02.987 に答える
1

まず、表示されたクエリがまったく機能せず、サブクエリにありませ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 BYDISTINCT同じクエリレベルで異議を唱えることはできません。これを回避するには、GROUP BY代わりに使用するか、クエリ全体をサブクエリに入れて別のクエリを実行SELECTORDER 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
于 2012-08-10T15:13:25.487 に答える