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

LEFT JOIN对返回MIN(Value_2)per的相关子查询执行 a 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

这对你有用吗?

 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 回答
0

如果您需要来自 的任何其他信息Table_2,或者需要加入其他表,Michael 的解决方案当然是正确的(尽管您可以将我的解决方案转换为子选择来解决这个问题)。但只是为了获得请求的具体结果,您可以使用这个简单的查询:

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 回答