【问题标题】:SELECT a non ID column in a foreign key table (TABLE B) based on the foreign key in the primary table (TABLE根据主表(TABLE)中的外键选择外键表(TABLE B)中的非ID列
【发布时间】:2014-06-24 07:14:10
【问题描述】:

我有两个表,一个 STUDENT 和一个 RULES 表。学生表保存与学生相关的数据,规则表保存与特定学生相关的规则。 现在在学生表上,我有 5 列作为规则表的外键,例如

CREATE TABLE dbo.RULES
(
    ID int identity not null primary key,
    RULENAME varchar
)

CREATE TABLE dbo.STUDENT
(
    ID int identity not null primary key,
    NAME varchar(50),
    SURNAME varchar(50),
    ADRESS varchar(50),
    RULE1 int not null references dbo.RULES(ID),
    RULE2 int not null references dbo.RULES(ID),
    RULE3 int not null references dbo.RULES(ID),
    RULE4 int not null references dbo.RULES(ID),
    RULE5 int not null references dbo.RULES(ID)
)

我想要实现的是从学生表中选择 NAME、SURNAME、ADDRESS 并将其与 STUDENT 中每个 RULE 外键的 RULENAME 连接起来,例如

NAME SURNAME ADDRESS RULE1NAME RULE2NAME RULE3NAME RULE4NAME RULE5NAME

我整晚都在努力破解这个问题,但遗憾的是我仍然在第一方。我将这归因于我缺乏 SQL 经验,但是,有漂亮的人可以帮帮我吗?

更新

感谢你们的回答,dotnetom、Bharadwaj。

我按照 dotnetoms 答案的建议加入了 5 次。该查询工作正常,但它为所有五个规则返回相同的规则。这是我的查询

SELECT 
STUDENT.NAME, 
STUDENT.SURNAME, 
STUDENT.ADDRESS, 
RULES.RULENAME AS RULE1NAME, 
RULES.RULENAME AS RULE2NAME, 
RULES.RULENAME AS RULE3NAME, 
RULES.RULENAME AS RULE4NAME, 
RULES.RULENAME AS RULE5NAME
FROM STUDENT s 
INNER JOIN RULES AS r1 ON STUDENT.RULE1 = RULES.ID
INNER JOIN RULES AS r2 ON STUDENT.RULE2 = RULES.ID
INNER JOIN RULES AS r3 ON STUDENT.RULE3 = RULES.ID
INNER JOIN RULES AS r4 ON STUDENT.RULE4 = RULES.ID
INNER JOIN RULES AS r5 ON STUDENT.RULE5 = RULES.ID

有什么建议吗?谢谢!

【问题讨论】:

  • 这是 MySQL 还是 SQL Server 的问题?
  • 您已将此标记为mysql sql-server。那是两种不同的产品。您是否打算同时标记两者?此外,当您有 multiple 列仅由数字区分时,这通常是 SQL 中的一种设计味道 - 学生与规则的绑定可能应该是 separate 多对-许多表有尽可能多的
  • 一个 SQL Server 问题。抱歉,我应该以某种方式指定吗?
  • 重新标记........新手错误
  • 规则表可以left join 5次。

标签: sql sql-server database


【解决方案1】:

你应该可以使用这个查询:

SELECT 
    s.NAME, 
    s.SURNAME, 
    s.ADDRESS, 
    r1.RULENAME AS RULE1NAME, 
    r2.RULENAME AS RULE2NAME, 
    r3.RULENAME AS RULE3NAME, 
    r4.RULENAME AS RULE4NAME, 
    r5.RULENAME AS RULE5NAME
FROM STUDENT s 
    INNER JOIN RULES r1 ON s.RULE1 = r1.ID
    INNER JOIN RULES r2 ON s.RULE2 = r2.ID
    INNER JOIN RULES r3 ON s.RULE3 = r3.ID
    INNER JOIN RULES r4 ON s.RULE4 = r4.ID
    INNER JOIN RULES r5 ON s.RULE5 = r5.ID

【讨论】:

  • INNER JOIN 将要求所有 5 个rules 都必须存在于student。否则不会显示任何记录。
  • 所有引用字段都定义为 RULEX int not null,表示它们会存在
  • 感谢您的回答。查询有效。现在的问题是它在所有规则名称别名中返回相同的规则名称
  • RULES.RULENAME AS RULE1NAME, RULES.RULENAME AS RULE2NAME, RULES.RULENAME AS RULE3NAME, RULES.RULENAME AS RULE4NAME, RULES.RULENAME AS RULE5NAME 在所有 5 个规则名称别名中返回相同的规则名称跨度>
  • 您不应该使用规则,您需要为每个规则指定一个别名。复制粘贴答案中的查询,您将获得不同的名称
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多