[英]How to receive specific rows in inner join SQL
您可能想尝试窗口功能
SELECT T.col1, T.col3
FROM (
SELECT t1.col1, t2.col3 ,
ROW_NUMBER () over (partition by t1.col1 order by t2.col3) as orden
FROM t1 INNER JOIN t2
ON t1.col2=t2.col2) as T
WHERE T.orden = 1;
使用OUTER APPLY的另一种方法:
SELECT t1.col1,p.col3
FROM t1
OUTER APPLY (
SELECT TOP 1 *
FROM t2
WHERE t1.col2 = t2.col2) as p
输出:
col1 col3
1 10
2 30
You can also use below
Select Col1,Col3 From (
SELECT Col1,Col3,DENSE_RANK() OVER (PARTITION BY t2.Col2 ORDER BY Col3) rank
FROM T2 JOIN T1 on T2.col2=T1.col2) Tr where rank=1
所有答案都是正确的..但有些会带来不同甚至最差的,不可预测的输出(非确定性)。
在解决方案1)来自@ AllanS.Hansen和@GiorgosBetsos的分组/分钟 ,你将在t1中的每一行只收到一行t2。 将使用为几乎每种数据类型定义的min()函数选择该行。
解决方案2)来自@vercelli的row_number = 1与解决方案相同1)它通过col3 ASC保持第一个值顺序这与MIN()相同
请注意! 解决方案3) 外部应用来自@ gofr1是类似的,但它不保证输出,top函数可以在每次运行时给出不同的结果,如果你没有通过col3子句指定一个顺序 (优化器将决定依赖于索引或聚簇键)。 如果您指定它,它将提供解决方案的相同输出1)和解决方案2)
你必须决定TOP对你意味着什么,它可能与sql server TOP函数的含义不同。
我认为最好的解决方案是添加一个带排序顺序的列。
您可以使用整数列,例如1,2,3作为排序顺序,也可以使用标识。 在这种情况下,您还将拥有“ 广告订单 ”
我将避免使用OUTER APPLY,因为它为t1的每一行执行,并且比其他解决方案慢。
您可以使用如下查询:
SELECT t1.col1, t2.col3
FROM t1
INNER JOIN (
SELECT col2, MIN(col3) AS col3
FROM t2
GROUP BY col2
) AS t2 ON t1.col2=t2.col2;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.