Why Error 1054 is being returned by OP query
返回的错误是因为从UNION的结果中分配给列的名称取自第一个SELECT .
您可以通过运行一个简单的示例来观察:
SELECT 1 AS one
UNION
SELECT 2 AS two
该查询返回的结果集将包含单个列,分配给该列的名称将为 one ,即第一个SELECT中的列名 . 这解释了为什么从查询中收到错误的原因 .
One way to return rows with no match
要从 table1 返回 col1 的值,该值与 col1 中 col1 列中的任何值都不匹配...
使用反连接模式的一个选项...
SELECT t1.col1
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.col1 = t1.col1
WHERE t2.col1 IS NULL
LEFT JOIN 操作返回table1中的所有行,以及table2中找到的任何"matching"行 . "trick"是WHERE子句中的谓词...来自table2的任何"matching"行在col1中将具有非NULL值 . 因此,如果我们排除了找到匹配项的所有行,那么're left with rows from table1 that didn' t就会匹配 .
如果我们想从 table2 获取 table1 中没有"matching"行的行,我们可以做同样的事情,只需翻转表的顺序 .
如果我们组合两个集合,但只想要"distinct" "not matched"值列表,我们可以使用 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
Finding out which table the non-matched value is from
有时,我们想知道哪个查询返回了值;我们可以通过在每个查询中包含一个文字值作为鉴别器来实现 .
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
A different (usually less performant) approach to finding non-matching rows
一个完全不同的方法,返回一个等效的结果,将做这样的事情:
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 将"materialized"作为派生表,因此这种方法对于大型集合来说可能是昂贵的,并且这种方法不会利用 col1 上的索引来执行匹配 . )这与反之间的另一个小差别-join方法:如果两个表中都存在NULL,则将省略col1值为NULL . 除此之外,结果集是等效的 .