【问题标题】:SQL query join tables dataSQL查询连接表数据
【发布时间】:2021-10-07 06:04:08
【问题描述】:

我有 2 个表 UsersTimeSheetsTimesheets 表有列 UserId 这显然是用户表的用户 ID :)

逻辑

我正在尝试获取Timesheets 表的所有数据以及只是用户表中的用户名,但不知何故,我的查询似乎与此相反!

现在我知道这可能是一个简单的查询,但我个人对 SQL 一无所知(我的错!)

这是我的查询:

CREATE PROCEDURE [dbo].[GetTimeSheets]
AS
BEGIN
    SELECT 
        t.Id, t.Enter_time, t.Exit_Time, t.Total, t.Date, 
        t.Month, t.Year, u.Name AS username
    FROM 
        TimeSheets t
    FULL OUTER JOIN 
        Users u ON u.Id = t.UserId
    GROUP BY 
        t.Id, t.Enter_time, t.Exit_Time, t.Total, t.Date, 
        t.Month, t.Year, u.Name
END;

这里是返回数据的截图:

如您所见,我得到了我的用户名,而时间表表中没有任何数据!

这个视图应该从用户那里获取时间表和每一行的用户名。

更新

这是我的时间表表架构

CREATE TABLE [dbo].[TimeSheets]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [UserId] INT NOT NULL, 
    [Enter_time] TIME NOT NULL, 
    [Exit_Time] TIME NULL, 
    [Total] TIME NULL, 
    [Date] DATE NULL, 
    [Month] NVARCHAR(50) NOT NULL , 
    [Year] NVARCHAR(50) NOT NULL , 

    CONSTRAINT [FK_TimeSheets_Users] 
        FOREIGN KEY ([UserId]) REFERENCES [dbo].[Users]([Id])
);

这里是用户表

CREATE TABLE [dbo].[Users] 
(
    [Id]       INT            NOT NULL,
    [UserType] NVARCHAR (50)  NOT NULL,
    [Name]     NVARCHAR (100) NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
);

【问题讨论】:

  • 请输入样本数据以及所需的输出。

标签: sql sql-server tsql join stored-procedures


【解决方案1】:

您似乎想要一个INNER 加入,并且由于您没有进行任何聚合,因此不需要GROUP BY

SELECT t.*, 
       u.Name AS username
FROM TimeSheets t
INNER JOIN Users u 
ON u.Id = t.UserId;

通过进行INNER 连接,只有当 2 个表中的 2 行之间存在匹配时,您才能获得结果。

【讨论】:

  • 谢谢,我刚刚将选择部分更改为 SELECT t.Id, t.Enter_time, t.Exit_Time, t.Total, t.Date, t.Month, t.Year, 以匹配我的视图表,否则我的视图中将有额外的 userId 列。
  • @mafortis 很好,但我注意到名称在用户表中没有定义为唯一,所以也许你应该保留 userId 以防有 2 个用户具有相同的名称。
  • 是的,我也有用户名列,但因为我没有将它用于此查询,所以我没有提及它。那个专栏是独一无二的,谢谢
【解决方案2】:

好吧,为了访问用户,您必须将用户表提供给 TimeSheets LEFT JOIN,这样如果用户配置文件为空。

SELECT t.Id, t.Enter_time, t.Exit_Time, t.Total, t.Date, t.Month, t.Year, u.Name as username
FROM Users u
LEFT JOIN TimeSheets t ON u.Id = t.UserId
GROUP BY t.Id,t.Enter_time,t.Exit_Time,t.Total, t.Date, t.Month, t.Year, u.Name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2019-07-31
    • 2014-03-01
    • 2014-03-28
    • 2018-05-11
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多