Sql 在FROM子句中使用同一个表两次
我有一张这样的桌子:Sql 在FROM子句中使用同一个表两次,sql,Sql,我有一张这样的桌子: 1 | 'Frank' | 'A' 2 | 'Frank' | 'B' 3 | 'Tom' | 'A' 4 | 'Tom' | 'B' 我想要一个如下所示的输出: 1 | 'Frank' | 'A' 2 | 'Frank' | 'B' 3 | 'Tom' | 'A' 4 | 'Tom' | 'B' Frank | A | B 汤姆| A | B 我想到了这个: SELECT N.Name, N.Surname, M.Surname FROM NAMES
1 | 'Frank' | 'A'
2 | 'Frank' | 'B'
3 | 'Tom' | 'A'
4 | 'Tom' | 'B'
我想要一个如下所示的输出:
1 | 'Frank' | 'A'
2 | 'Frank' | 'B'
3 | 'Tom' | 'A'
4 | 'Tom' | 'B'
Frank | A | B汤姆| A | B 我想到了这个:
SELECT N.Name, N.Surname, M.Surname
FROM NAMES N, NAMES M
WHERE N.Surname = 'B' AND M.Surname = 'A'
GROUP BY N.Name;
这似乎有效,但我不知道在FROM子句中两次使用同一个表是否是一种好的做法,或者在大型表上是否会影响性能
有一个更简单的解决方案吗?在
中的后面有多个表是过时的:您可以使用标准的on
语法使您的join
更具可读性:
from Names n
join Names m
on n.name = m.name
带有限制条件的自联接并不太昂贵。而Name
是一个非常严格的条件:只有2条记录将共享该名称
在支持row\u number()
的数据库中,可以更高效地编写它。它允许您在不使用联接的情况下运行查询
:
select Name
, max(case when rn = 1 then Surname end) as Surname1
, max(case when rn = 2 then Surname end) as Surname2
, max(case when rn = 3 then Surname end) as Surname3
from (
select row_number() over(
partition by Name
order by Surname) as rn
, Name
, Surname
from YourTable
) SubQueryAlias
group by
Name
尝试使用代码块(行首四个空格)格式化表布局和查询。更容易阅读。它是从子句而不是为子句调用的。您使用的是什么数据库?如果5 |'Ann'|'A'
不是'B'
会发生什么?您想跳过这一行吗?为什么对此投反对票?谢谢,我明天会尝试实现它,因为它现在是凌晨2点,但听起来不错。