繁体   English   中英

如何在内连接SQL中接收特定行

[英]How to receive specific rows in inner join SQL

如何进行内连接并从具有相同列的行中仅选择一行?

例如:

在此输入图像描述 在此输入图像描述

如果我执行查询:

SELECT t1.col1, t2.col3 
FROM t1 INNER JOIN t2 
ON t1.col2=t2.col2;

我会拿到桌子

在此输入图像描述

但是,我想只为col1中的每个值接收一行(最上面一行)

在此输入图像描述

有任何想法吗?

谢谢!

您可能想尝试窗口功能

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM