查询时是否可以替换多个外键的内容?
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;
别这样!使用关系数据库的要点之一是数据只存储在一个地方。这是一个很大的方便。当然,也有例外,但这些例外应该有坚定的理由。
在这种情况下,只需定义一个视图:
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
我有以下 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;
别这样!使用关系数据库的要点之一是数据只存储在一个地方。这是一个很大的方便。当然,也有例外,但这些例外应该有坚定的理由。
在这种情况下,只需定义一个视图:
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