Таблицы запросов MS SQL, где данные могут существовать или не существовать - PullRequest
0 голосов
/ 24 июня 2019

Не нашел точного варианта использования того, чего я пытаюсь достичь в Stackoverflow, поэтому объясню это в надежде, что кто-то может помочь.

У меня есть две таблицы, одна содержит основной список действий, а другая содержит информацию о том, кто выполнил эти действия.

Таблица A - Таблица активности.Это отдельный список того, что можно сделать.

ID  |  Activity
---------------------------
1   |  Change Oil
2   |  Change Airfilter
3   |  Change Brake Fluid

Таблица B - таблица журнала активности.Это отслеживает, где люди сделали одно из вышеперечисленных действий.ActivityID ссылается на идентификатор в таблице A.

ID  | ActivityID  | CompletedBy 
---------------------------------------
1   | 1           | john@auto.com
2   | 1           | sally@auto.com
3   | 3           | john@auto.com

Я пытаюсь составить список всех видов деятельности, но только для отдельного человека.Я пробовал несколько способов для этого, но могу только получить запрос, чтобы показать, где значения существуют в обеих таблицах.

Мой предпочтительный вывод будет следующим: где в запросе я попросил показать мне полный список действий, а также показать, где Джон что-то выполнил.Если в таблице B нет записи для этого действия, чтобы отобразить пустое значение.

ID  | Activity            | CompletedBy
-------------------------------------------
1   | Change Oil          | john@auto.com
2   | Change Airfilter    | 
3   | Change Brake Fluid  | john@auto.com

Вот мой текущий SQL-запрос, в котором я пытался отработать этот запрос, и сейчас результаты возвращают только идентификатор1 и 3 из приведенного выше примера, где у Джона есть запись в таблице B.

Select a.ID, a.Activity, b.CompletedBy
FROM ActivityList a
LEFT OUTER JOIN ActivityLog b
ON a.ID = b.ActivityID
Where CompletedBy = 'john@auto.com'
GROUP BY a.ID, a.Activity, b.CompletedBy

Любая помощь или указатели в правильном направлении будет принята с благодарностью.

Ответы [ 5 ]

2 голосов
/ 24 июня 2019

Если вы переместите ограничение CompletedBy в условия объединения, вам не понадобится группа по.

Select a.ID, a.Activity, b.CompletedBy
FROM ActivityList a
LEFT OUTER JOIN ActivityLog b
ON a.ID = b.ActivityID and b.CompletedBy = 'john@auto.com'
1 голос
/ 24 июня 2019

Измените условие where на Where CompletedBy = 'john@auto.com' or CompletedBy is null, чтобы оно соответствовало текстовому совпадению или случаю, когда имя вообще не существует.Вы также можете использовать isnull( для преобразования нулевого значения в пустую строку, если вы хотите именно такое поведение.

Select a.ID, a.Activity, isnull(b.CompletedBy, '') as CompletedBy
FROM ActivityList a
LEFT OUTER JOIN ActivityLog b
ON a.ID = b.ActivityID
Where CompletedBy = 'john@auto.com' or b.CompletedBy is null
GROUP BY a.ID, a.Activity, b.CompletedBy
0 голосов
/ 24 июня 2019

Ваш запрос правильный, просто измените зелье условия.

Select a.ID, a.Activity, b.CompletedBy
FROM ActivityList a
LEFT JOIN ActivityLog b
ON a.ID = b.ActivityID AND b.CompletedBy = 'john@auto.com' 
GROUP BY a.ID, a.Activity, b.CompletedBy
0 голосов
/ 24 июня 2019
----------
Select a.ID, a.Activity, b.CompletedBy
FROM ActivityList a
Right OUTER JOIN ActivityLog b
ON a.ID = b.ActivityID
Where CompletedBy = 'john@auto.com'
GROUP BY a.ID, a.Activity, b.CompletedBy
0 голосов
/ 24 июня 2019

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable table_A = new DataTable();
            table_A.Columns.Add("ID", typeof(int));
            table_A.Columns.Add("Activity", typeof(string));

            table_A.Rows.Add(new object[] { 1, "Change Oil"});
            table_A.Rows.Add(new object[] { 2, "Change Airfilter"});
            table_A.Rows.Add(new object[] { 3, "Change Brake Fluid"});


            DataTable table_B = new DataTable();
            table_B.Columns.Add("ID", typeof(int));
            table_B.Columns.Add("ActivityID", typeof(string));
            table_B.Columns.Add("CompletedBy", typeof(string));

            table_B.Rows.Add(new object[] { 1, 1, "john@auto.com"});
            table_B.Rows.Add(new object[] { 2, 1, "sally@auto.com"});
            table_B.Rows.Add(new object[] { 3, 3, "john@auto.com"});

            var groups = (from a in table_A.AsEnumerable()
                          join b in table_B.AsEnumerable() on a.Field<int>("ID") equals b.Field<int>("ID")
                          select new { a = a, b = b})
                          .GroupBy(x => x.b.Field<string>("CompletedBy"))
                          .ToList();

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...