我有 2 个表 Users
和 TimeSheets
,Timesheets
表有 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)
);
答案 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