SQL 查询连接表数据

时间:2021-08-01 16:10:53

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

我有 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;

这里是返回数据的截图:

one

如您所见,我在时间表表中不存在任何数据的情况下获取我的用户名!

这个视图应该从用户那里获取时间表表,然后是每行的用户名。

更新

这是我的时间表表格架构

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)
);

2 个答案:

答案 0 :(得分:2)

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

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

通过执行 INNER 联接,您仅在 2 个表中的 2 行之间存在匹配时才能获得结果。

答案 1 :(得分:0)

好吧,为了访问用户,您必须将用户表提供给 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