Данные таблиц соединения SQL-запросов

#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