#sql #sql-server #tsql #join #stored-procedures
Вопрос:
У меня есть 2 таблицы Users
, и TimeSheets
Timesheets
в таблице есть столбец UserId
, который, очевидно, представляет собой таблицу пользователей с идентификатором пользователя 🙂
Логические
И я пытаюсь получить все данные 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)
);
Комментарии:
1. Пожалуйста, введите примерные данные, а также желаемый результат.
Ответ №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 таблицах.
Комментарии:
1. Спасибо, я просто изменил «Выбрать часть
SELECT t.Id, t.Enter_time, t.Exit_Time, t.Total, t.Date, t.Month, t.Year,
«, чтобы она соответствовала моей таблице представлений, иначеuserId
в моем представлении был бы дополнительный столбец.2. @mafortis хорошо, но я заметил, что имя не определено как УНИКАЛЬНОЕ в таблице Пользователи, поэтому, возможно, вам следует сохранить идентификатор пользователя на случай, если есть 2 пользователя с одинаковым именем.
3. да, у меня также есть столбец имени пользователя, но поскольку я не использовал его для этого запроса, я не упомянул об этом. Эта колонка уникальна, спасибо
Ответ №2:
Ну, для того, чтобы получить доступ к пользователям, вы должны предоставить таблицу пользователей для регистрации расписаний, чтобы присоединиться, если профиль пользователя пуст.
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