繁体   English   中英

在Union中使用where子句

[英]using where clause with Union

我有两个表,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,'aaa')和(2,'bbb1')那么新表应该有(2,'bbb) ')和(2,'bbb1')

但是,这似乎不起作用。 请让我知道我哪里出错了,做正确的方法是什么。

Union不会比较数据。你需要Join这里

SELECT * 
FROM t1 AS a 
inner join  t2 AS b
on a.id =b.id 
and a.desc != b.desc

UNION ALL在查询的第一部分生成的行之后转储查询的第二部分的所有行。 你不能比较a的字段b的,因为它们属于不同的行。

什么你可能要做的是定位的记录t1id S的匹配这些t2 ,但不同的描述。 这可以通过JOIN来实现:

SELECT a.id, b.desc
FROM t1 AS a
JOIN t2 AS b ON a.id = b.id
WHERE a.desc != b.desc

这样,具有与t2记录匹配的ID的t1记录将最终在同一行的连接数据上,允许您对不等式的描述进行比较。

我想要选择的两行是描述不相等

您可以在通过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否则仅加入可以使用。

SELECT * 
FROM t1 AS a 
inner join  t2 AS b
on a.id =b.id 
and a.desc != b.desc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM