如果没有条目,如何让SQL Inner Join返回第一个条目或空白

时间:2013-01-17 20:42:02

标签: sql oracle inner-join

第一次发帖;一直在阅读很多答案,而且大多数都有所帮助,但我已经陷入了困境。使用Oracle SQL,我正在尝试使用内部联接执行select,但是我想从另一个表中选择第一个条目(如果有的话)。

提出的例子:

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语句是

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(),但我不能。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:2)

针对相关子查询执行LEFT JOIN,该子查询返回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。我选择了{{1}}首先排序的那个。

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

(抱歉所有的编辑 - SQLfiddle中的几个错误修正)

答案 1 :(得分: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
 );

答案 2 :(得分: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