Sql 将where子句与Union一起使用
我有两个表,t1和t2,它们有相同的列(id,desc)和数据。但是其中一列desc对于同一主键id可能具有不同的数据 我想从这两个表中选择所有这些行,以便t1.desc!=t2.descSql 将where子句与Union一起使用,sql,oracle,Sql,Oracle,我有两个表,t1和t2,它们有相同的列(id,desc)和数据。但是其中一列desc对于同一主键id可能具有不同的数据 我想从这两个表中选择所有这些行,以便t1.desc!=t2.desc select a.id, b.desc FROM (SELECT * FROM t1 AS a UNION ALL SELECT * FROM t2 AS b) WHERE a.desc != b.desc 例如,如果t1有(1,'aaa')和(2,'bbb'),t2有(1,'a
select a.id, b.desc
FROM (SELECT * FROM t1 AS a
UNION ALL
SELECT * FROM t2 AS b)
WHERE a.desc != b.desc
例如,如果t1有(1,'aaa')和(2,'bbb'),t2有(1,'aaa')和(2,'bbb1'),那么新表应该有(2,'bbb')和(2,'bbb1'))
然而,这似乎不起作用。请告诉我哪里出了问题,正确的方法是什么。
Union
不会比较数据。您需要在此处加入
SELECT *
FROM t1 AS a
inner join t2 AS b
on a.id =b.id
and a.desc != b.desc
UNION ALL
在查询第一部分生成的行之后转储查询第二部分的所有行。不能将a
的字段与b
的字段进行比较,因为它们属于不同的行
您可能正在尝试查找t1
的记录,其中id
s与t2
的记录匹配,但描述不同。这可以通过加入来实现:
SELECT a.id, b.desc
FROM t1 AS a
JOIN t2 AS b ON a.id = b.id
WHERE a.desc != b.desc
通过这种方式,t1
的记录与t2
的ID匹配,将在连接数据的同一行上结束,从而允许您对不等式的描述进行比较
如果描述不相等,我希望选择两行
您可以在通过join获得的两组行之间使用UNION ALL
,并使用表交换位置,如下所示:
SELECT a.id, b.desc -- t1 is a, t2 is b
FROM t1 AS a
JOIN t2 AS b ON a.id = b.id
WHERE a.desc != b.desc
UNION ALL
SELECT a.id, b.desc -- t1 is b, t2 is a
FROM t2 AS a
JOIN t1 AS b ON a.id = b.id
WHERE a.desc != b.desc
UNION运算符用于组合两个或多个SELECT语句的结果集
请注意,UNION中的每个SELECT语句必须具有相同的列数。列还必须具有类似的数据类型
所以,如果它具有相同的列数和相同的数据类型,则可以使用Union,否则只能使用join
SELECT *
FROM t1 AS a
inner join t2 AS b
on a.id =b.id
and a.desc != b.desc
您的RDBMs是什么?请用查询代码而不是图片编辑您的问题。如果您不知道如何设置格式,只需在代码前后各留出一行空白,每行前留出4个空格或制表符。谢谢您的回答。但是如果描述不相等,我希望选择这两行。也就是说,新表应该包含t1和t2中描述不同的所有行。例如,如果t1有(1,'aaa')和(2,'bbb'),t2有(1,'aaa')和(2,'bbb1'),那么新表应该有(2,'bbb')和(2,'bbb1')。再次感谢,谢谢。我会试试的。谢谢你的澄清。