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点,但听起来不错。