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(),但不能。有任何想法吗?谢谢!
对相关的子查询执行
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 |
请注意,没有
http://sqlfiddle.com/#!2/30a6c/5
(抱歉,所有编辑-SQLfiddle中的几个错误修复)
如果您需要
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 ); |