【问题标题】:Is it possible to replace content from multiple foreign keys when doing a query?进行查询时是否可以从多个外键中替换内容?
【发布时间】:2019-12-22 01:15:42
【问题描述】:

我有以下表格:

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 Pairings 中的两列都是 table player 的列 id 的外键。

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

相反,如果我能在一个查询中得到名字就好了,比如:

RESULT
player_a | player_b
C        | A
B        | D 

这可能吗?提前非常感谢。

【问题讨论】:

    标签: sql database denormalization


    【解决方案1】:

    希望能帮到你

    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
    

    之后,只需选择通常 从 vwPAIRINGS 中选择 *

    【讨论】:

      【解决方案2】:

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

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

      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 表中的所有其他信息。

      【讨论】:

        【解决方案3】:

        您可以将PAIRINGS 表加入PLAYER 表,两次:

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          • 1970-01-01
          • 2021-03-08
          相关资源
          最近更新 更多