MS SQL查询数据可能存在或不存在的表

时间:2019-06-24 07:00:00

标签: c# sql sql-server

我在Stackoverflow上没有实现确切的用例,因此将对其进行解释,希望有人能提供帮助。

我有两个表,一个包含主活动列表,另一个包含谁完成了这些活动。

表A是活动表。这是可以完成的事情的清单。

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

表B是活动日志表。这将跟踪人们执行上述活动之一的位置。 ActivityID链接到表A上的ID。

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查询,现在结果只返回上面示例中john实际在表B中有记录的ID 1和3。

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 个答案:

答案 0 :(得分:2)

如果将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 :(得分:1)

将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

答案 2 :(得分:0)

尝试以下操作:

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

        }
    }
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您的查询是正确的,只需更改条件的一部分。

function changeFirst() {
  let h = document.querySelector("#firstElement h1");
  h.textContent = h.textContent==="This is the 1st element" ? "Changed first" : "This is the 1st element"
}