我在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
任何帮助或指向正确方向的指针将不胜感激。
答案 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"
}