查询时是否可以替换多个外键的内容?

Is it possible to replace content from multiple foreign keys when doing a query?

我有以下 tables:

TABLE PLAYER
id | name
1  | A
2  | B
3  | C
4  | D

TABLE PAIRINGS
id | player_a | player_b
1  | 3        |1
2  | 2        |4

table 配对中的两列都是 table 玩家的列 ID 的外键。

我的问题是,每次我想知道哪个是我的玩家的名字(例如,Select name From Player Where Id = pairings.player_a)时,我都想避免从代码中进行查询。我考虑过将 Name 添加为配对 table 的额外列,但这会使它非规范化。

相反,如果我能在一次查询中获取名称就好了,比如:

RESULT
player_a | player_b
C        | A
B        | D 

这可能吗?非常感谢。

您可以加​​入 PAIRINGS table 到 PLAYER table,两次:

SELECT
    p1.name AS player_a,
    p2.name AS player_b
FROM PAIRINGS pr
INNER JOIN PLAYER p1
    ON pr.player_a = p1.id
INNER JOIN PLAYER p2
    ON pr.player_b = p2.id;

Demo

别这样!使用关系数据库的要点之一是数据只存储在一个地方。这是一个很大的方便。当然,也有例外,但这些例外应该有坚定的理由。

在这种情况下,只需定义一个视图:

CREATE VIEW vw_pairings AS
    SELECT p.*, pa.name AS player_a_name,
           pb.name AS player_b_name
    FROM PAIRINGS p JOIN
         PLAYER pa
         ON p.player_a = pa.id JOIN
         PLAYER pb
         ON p.player_b = pb.id;

当您从视图中查询时,您将在 PAIRINGS table.

中看到名称以及所有其他信息

希望能帮到你

Select * Into #PLAYER From (
    Select 1 [ID], 'A' [Name] Union All
    Select 2 [ID], 'B' [Name] Union All
    Select 3 [ID], 'C' [Name] Union All
    Select 4 [ID], 'D' [Name] 
) A

Select * Into #PAIRINGS From (
    Select 1 [ID], 3 [PLAYER_A], 1 [PLAYER_B] Union All
    Select 2 [ID], 2 [PLAYER_A], 4 [PLAYER_B]
) A

Select 
    P.ID, A.NAME, B.NAME 
From #PAIRINGS P
Left Join #PLAYER A On A.ID = P.PLAYER_A
Left Join #PLAYER B On B.ID = P.PLAYER_B

您可以创建视图,以避免查询 示例

Create View vwPAIRINGS As
    Select 
        P.ID, A.NAME, B.NAME 
    From #PAIRINGS P
    Left Join #PLAYER A On A.ID = P.PLAYER_A
    Left Join #PLAYER B On B.ID = P.PLAYER_B

之后,只是 select 平常 Select * 来自 vwPAIRINGS