经过许多评论,我认为这就是你想要的...
SELECT T1.*
FROM table1 t1
LEFT JOIN table2 t2
on T1.ID = T2.ID
and T1.Name = T2.Name
AND E2.event_Time_UTC between convert(datetime,'2016-02-09 00:00:20',101) and convert(datetime '2016-02-09 23:59:52',101)
WHERE T2.Name is null
AND E1.Event_Time_UTC between convert(datetime,'2016-02-09 00:00:20',101) and convert(datetime,'2016-02-09 23:59:52',101)
您可以允许隐式转换,但以上是显式方法。
如果不允许,则需要将字符串日期转换为日期时间,假设Event_Time_UTC是日期/时间数据类型。
左连接使我们可以返回第一个表中的所有记录以及与第二个表匹配的记录。
t1.*仅返回来自table1的列。连接条件(on)允许我们识别匹配的记录,因此它们可以在where子句中通过'where t2.name is null'进行消除,当t2中没有匹配记录时,它们将始终为空。
因此,您将获得一个结果集:从t1中获取所有记录,其中名称和id在table2中没有匹配记录。
旧版本
根据评论,以下内容已不再相关。
我删除了之前的回答,因为您正在使用 SQL Server 而不是 MySQL,并且我知道您想要多个记录而不是连接 table1 和 table2。
下面我创建了两个表:table1 和 table2。然后我用一些示例数据填充了 table1 和 table2。
接下来,我展示了如何仅获取存在于一个表中但不存在于另一个表中的记录;每个记录返回一个单独的 ROW。然后我详细介绍了为什么我选择这种方法而不是其他方法。最后,我将回顾您尝试过的内容,并尝试解释为什么我认为它不会起作用。
create table table1 (
ID int,
name varchar(20),
col1 varchar(20),
col2 varchar(20),
col3 varchar(20));
Create table table2 (
id int,
name varchar(20));
Insert into table1 values (1,'John','col1','col2','col3');
Insert into table1 values (2,'Paul','col1','col2','col3');
Insert into table1 values (3,'George','col1','col2','col3');
Insert into table2 values (1,'John');
Insert into table2 values (4,'Ringo');
选项1
SELECT T1.name, T1.ID, T1.Col1, T1.Col2, T1.Col3
FROM Table1 T1
LEFT JOIN Table2 T2
on T1.Name = T2.Name
and T1.ID = T2.ID
WHERE T2.ID is null
UNION ALL
SELECT T2.name, T2.ID, NULL, NULL, NULL
FROM Table1 T1
RIGHT JOIN Table2 T2
on T1.Name = T2.Name
and T1.ID = T2.ID
WHERE T1.ID is null ;
这导致...
注意,John在两个表中都没有出现。我们从table1中获得了另外两条记录,并且你想要的table2的ID和名称。
通常情况下,我会使用全外连接,但由于我认为你想重用名称和ID字段来关联同一列中的BOTH表,因此我们不得不使用这种方法,并在table1中拼写所有列名,当显示来自table2的记录时,在table1中将每个列放置为NULL,以使第二个查询的输出与第一个查询联合起来。我们无法使用“*”符号。
选项2:使用全外连接...使用T1中的所有列
SELECT T1.*
FROM Table1 T1
FULL OUTER JOIN Table2 T2
on T1.ID = T2.ID
and T1.Name = T2.Name
WHERE (T1.ID is null or T2.ID is null)
你得到了这个...它没有显示Ringo...
但我想问为什么您需要从表2获取任何内容,因此我认为当表1中不存在时,您仍希望显示表2的ID、名称。
这就是为什么我认为您需要使用联合所有的第一个查询结果。
选项3,我想我们可以通过执行...来避免选项1中的第二个查询
SELECT coalesce(T1.Name, T2.name) as name, coalesce(T1.Id,T2.ID) as ID, T1.col1, T1.Col2, T1.Col3
FROM Table1 T1
FULL OUTER JOIN Table2 T2
on T1.ID = T2.ID
and T1.Name = T2.Name
WHERE (T1.ID is null or T2.ID is null)
这样做是因为我们知道只需要从table2中获取名称和ID,而table1中的所有列值都将为空。
但请注意,在所有情况下,我们都不能使用Tablename.*来选择从table1中选取所有记录。
这样做可以得到我认为所需的结果。
这是你尝试的内容:
( SELECT name,id FROM table1
EXCEPT
SELECT name,id FROM table2)
UNION ALL
( SELECT name,id FROM table2
EXCEPT
SELECT name,id FROM table1)
假设您想要重复使用ID、Name字段;您无法选择*。为什么?因为Table2中的记录不在Table1中,所以也不在Table1中。在我的示例中,如果您想让Ringo出现,您必须引用Table2!此外,*不能像我在选项3中所做的那样将ID和Name字段"合并"在一起。
如果您只想从Table1中获取列,这意味着您永远不会看到来自Table2的数据。如果您不需要来自Table2的数据(例如,在我的示例中的Ringo),那么我们为什么需要进行联合操作呢?我假设您想要Ringo,因此您必须在某个地方引用Table2中的name、id。
full outer join
来实现这个功能,并查看记录where (T1.Id or T2.ID is null)
,以确保来自其中一个的记录不存在于外部。 - xQbert