关于oracle:如何使用SQL内部联接返回第一个条目,如果没有条目则为空

How to have SQL Inner Join to return first entry or blank if no entry

首次发布;一直在阅读很多答案,并且大多数都提供了帮助,但是我被这个问题困住了。使用Oracle SQL,我尝试使用内部联接执行选择,但是如果有一个连接,我想从另一个表中选择第一个条目。

缩写示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
2
3
1 XYZ Sample_1
2 ABC ''
3 DEF Sample_2

我正在使用的select语句是

1
2
3
4
5
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
2
1 XYZ Sample_1
3 DEF Sample_2

我尝试使用COALESCE(),但是我猜没有选择的行与NULL不同。希望我可以使用TOP(),但不能。有任何想法吗?谢谢!


对相关的子查询执行LEFT JOIN,该子查询返回每个IDMIN(Value_2)LEFT JOIN是获得缺少匹配项的空白所必需的。

1
2
3
4
5
6
7
8
9
10
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的情况下确实没有" first "。我选择了按Value_2首先排序的那个。

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

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


如果您需要Table_2中的任何其他信息,或者需要联接其他表(尽管可以将我的解决方案转换为子选择以解决该问题),那么

Michael的解决方案当然是正确的。但是只要获得所需的特定结果,就可以使用以下简单查询:

1
2
3
4
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

这对您有用吗?

1
2
3
4
5
6
 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
 );