为什么错误1054是由OP查询返回
返回的错误是因为从UNION结果中分配给列的名称是从第一个SELECT中获取的。
SELECT 1 AS one
UNION
SELECT 2 AS two
由该查询返回包含单个列的结果集,分配给列名称将是one
,从第一选择列名:
您可以通过运行一个简单的例子观察这。这解释了为什么你从查询中收到错误。
一种方式与不匹配
从table1
不匹配,从table2
的col1
列的任何值返回的col1
值返回行...
一个选项使用反接合模式...
SELECT t1.col1
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.col1 = t1.col1
WHERE t2.col1 IS NULL
Th e LEFT JOIN
操作返回全部行以及表2中找到的任何“匹配”行。 “技巧”是WHERE子句中的谓词...来自table2的任何“匹配”行在col1中将具有非空值。因此,如果我们排除找到匹配的所有行,则我们剩下来自table1的没有匹配的行。
如果我们想从table2
中得到table1
中没有“匹配”行的行,我们可以做同样的事情,只是翻转表的顺序。
如果我们结合了两套,但只想要“不匹配”值的“独特”列表中,我们可以使用UNION
集合运算符:
SELECT t1.col1
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.col1 = t1.col1
WHERE t2.col1 IS NULL
UNION
SELECT s2.col1
FROM table2 s2
LEFT
JOIN table1 s1
ON s1.col1 = s2.col1
WHERE s1.col1 IS NULL
-
找出哪个表的不匹配值是从
有时候,我们想知道哪个查询返回的值;我们可以通过在每个查询中包含一个字面值作为鉴别器。
SELECT 'table1' AS src
, t1.col1
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.col1 = t1.col1
WHERE t2.col1 IS NULL
UNION
SELECT 'table2' AS src
, s2.col1
FROM table2 s2
LEFT
JOIN table1 s1
ON s1.col1 = s2.col1
WHERE s1.col1 IS NULL
ORDER BY 2
不同的(通常不高性能)的方法来找到不匹配行
一种完全不同的方法,以返回一个等效的结果,将是这样做的:
SELECT q.col1
FROM (SELECT 't1' AS src, t1.col1 FROM table1 t1
UNION
SELECT 't2' AS src, t2.col1 FROM table2 t2
) q
GROUP BY q.col1
HAVING COUNT(DISTINCT q.src) < 2
ORDER BY q.col1
(内联视图q
将作为派生表“物化”,因此此方法可以是ex这种方法不会利用col1
上的索引来执行匹配。)与反连接方法之间的另一个小差异是:如果两个NULL都存在,则会省略col1的NULL值表。除此之外,结果集是等价的。
你想输出什么?如果你只执行'UNION'内部查询,你会发现这里出错了。 'UNION'只返回一列,它被称为'col1A'(虽然它也包含你所谓的'col1B'的值) – 2014-09-23 23:50:42
如果你从每个表格中发布一小段样本的行以及你希望的输出为了从样本中获得,我们可以帮助您解决这个问题。 – 2014-09-23 23:51:06
为什么不具体和使用:'WHERE table1.col1 <> table2.col1' – 2014-09-23 23:58:33