第一次发帖;一直在阅读很多答案,而且大多数都有所帮助,但我已经陷入了困境。使用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(),但我不能。有任何想法吗?谢谢!
答案 0 :(得分:2)
针对相关子查询执行LEFT JOIN
,该子查询返回MIN(Value_2)
每ID
个LEFT 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