2

初めての投稿; 多くの回答を読んでいて、ほとんどが役に立ちましたが、私はこれに行き詰まりました。Oracle SQL を使用して、内部結合で選択を実行しようとしていますが、別のテーブルがある場合は、そこから最初のエントリを選択したいと考えています。

簡略化された例:

Table_1
-ID
-Value

1 XYZ
2 ABC
3 DEF

Table_2
-ID
-Value_2

1 Sample_1
3 Sample_2
3 Sample_3

そして選択の結果、私は取得しようとしています:

1 XYZ Sample_1
2 ABC ''
3 DEF Sample_2

私が使用している選択ステートメントは

SELECT * FROM 
(SELECT ID,Value,Value_2 FROM Table_1 
INNER JOIN Table_2 ON Table_1.ID = Table_2.ID
WHERE Value_2 = (SELECT MIN(Value_2) FROM Table_2 WHERE ID=Table_2.ID)
);

しかし、私が得ている結果は、Table_2 が一致しないすべての行を削除することです。

1 XYZ Sample_1
3 DEF Sample_2

COALESCE() を使用してみましたが、No Rows Selected は NULL と同じではないと推測しています。TOP() を使用できればいいのですが、できません。何か案は?ありがとう!

4

3 に答える 3

2

perLEFT JOINを返す相関サブクエリに対して a を実行します。は、一致しない空白を取得するために必要です。MIN(Value_2)IDLEFT JOIN

SELECT
  Table_1.ID,
  Table_1.Value,
  minval.Value_2
FROM
  Table_1
  /* Subquery returns least Value_2 per group of ID */
  LEFT JOIN (
    SELECT ID, MIN(Value_2) AS Value_2 FROM Table_2 GROUP BY ID
  ) minval ON Table_1.ID = minval.ID

のない「最初」は実際には存在しないことに注意してくださいORDER BY。で最初にソートされるものを選択しましたValue_2

http://sqlfiddle.com/#!2/30a6c/5

(すべての編集について申し訳ありません - SQLfiddle のいくつかのバグ修正)

于 2013-01-17T20:46:48.527 に答える
0

から他の情報が必要な場合、または他のテーブルに参加する必要がある場合、マイケルのソリューションはもちろん正しいですTable_2(ただし、私のソリューションをサブセレクトに変換して回避することはできます)。ただし、要求された特定の結果を取得するためだけに、次の単純なクエリを使用できます。

SELECT Table_1.ID, Table_1.Value, MIN(Table_2.Value_2)
  FROM Table_1
  LEFT JOIN Table_2 ON Table_1.ID = Table_2.ID
  GROUP BY Table_1.ID, Table_1.Value
于 2013-01-17T21:10:30.213 に答える
0

これはうまくいきますか?

 SELECT * FROM 
 (SELECT ID,Value,Value_2 FROM Table_1 
 INNER JOIN Table_2 ON Table_1.ID = Table_2.ID
 WHERE Value_2 = (SELECT MIN(Value_2) FROM Table_2 WHERE ID=Table_2.ID)
 Order by ID Desc limit 0,1
 );
于 2013-01-17T20:49:48.577 に答える