【问题标题】:Querying 2/3 tables with one SQL statement一条SQL查询2/3表
【发布时间】:2013-03-31 02:30:48
【问题描述】:

我有三张桌子:users, projects, user_project

user_project 包含user_id, project_idrole_id,其中user_idproject_id 都是连接到projects.project_idusers.user_id 的主键。

我想从projects表到user_project获取与某个项目有关的users表中所有用户的姓名和姓氏。

我必须使用什么 SQL 语句?我在想这样的事情:

SELECT 
    users.name, users.surname 
FROM users 
WHERE users.user_id = user_project.user_id AND projects.project_id = @parameter

我正在使用 SQL Server 2012 和 ASP.NET/VB.NET。

数据库图:

http://i.imgur.com/lrv52wO.png

【问题讨论】:

    标签: asp.net sql vb.net sql-server-2012


    【解决方案1】:
    SELECT users.name, users.surname
    FROM users u
    INNER JOIN user_project up
    ON u.user_id = up.user_id
    WHERE up.project_id = @parameter
    

    【讨论】:

      【解决方案2】:

      如果您想根据@987654324 中的某些内容进行选择,您需要加入到您的其他表格 - 从UsersUser_Project 一直到Projects @表:

      SELECT 
          u.name, u.surname 
      FROM users u
      INNER JOIN user_project up ON u.user_id = up.user_id
      INNER JOIN project p ON p.project_id = up.project_id
      WHERE p.project_name = 'something'
      

      或至少链接表,如果您可以使用project_id 作为标准:

      SELECT 
          u.name, u.surname 
      FROM users u
      INNER JOIN user_project up ON u.user_id = up.user_id
      WHERE up.project_id = @parameter
      

      更新:假设您的Role 表再次通过链接表Users_role 连接到Users,那么您也需要这个来选择角色名称:

      SELECT 
          u.name, u.surname,
          RoleName = r.Name
      FROM users u
      INNER JOIN user_project up ON u.user_id = up.user_id
      INNER JOIN user_roles ur ON u.user_id = ur.user_id
      INNER JOIN role r ON ur.role_id = r.role_id
      WHERE up.project_id = @parameter
      

      【讨论】:

      • 如果我想从角色表中获取角色名称怎么办?我需要对 SQL 进行哪些修改?
      • @Brian:Role 表是如何与其他表连接的?您需要 (a) 加入角色表,然后 (b) 在您的 SELECT 中选择 role.name...
      • 角色表包含​​角色名称和角色 ID。 user_projects 还包含 role_id。我尝试SELECT users.name, users.surname, role.role_name FROM users role inner join user_project on users.user_id = user_project.user_id inner join user_project on role.role_id = user_project.role_id WHERE user_project.project_id = 4 进行测试,但没有成功。
      • @Brian:更新了我的回复 - 仍然不能 100% 确定表格是否是这样连接的 - 根据需要进行调整......
      • 虽然SQL查询执行成功,但没有返回任何数据。
      【解决方案3】:
      SELECT 
             users.name, users.surname 
      FROM   users 
             inner join user_project 
               on users.user_id = user_project.user_id
      WHERE  user_project.project_id = @parameter
      

      【讨论】:

        【解决方案4】:

        应该这样做。

        SELECT users.name, users.surname 
        FROM users 
        INNER JOIN user_project ON user_project.user_id = users.user_id 
        WHERE (user_project.project_id = @parameter)
        

        这里重要的一行是以INNER JOIN 开头的行。您不需要project 表,因为project_id 列在user_project 中。例如,如果您想获取项目名称,则需要 project 表。你可以通过写另一个INNER JOIN来做到这一点。

        INNER JOIN project ON project.project_id = user_project.project_id 
        

        现在您已加入,您可以访问project 表中的所有列。

        【讨论】:

          猜你喜欢
          • 2021-11-03
          • 2023-04-07
          • 1970-01-01
          • 2013-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多