MYSQL选择相同的列名作为联合中的别名不起作用

时间:2014-09-23 23:47:53

标签: mysql sql

我有一个简单的MYSQL查询来联合两个表:

SELECT * FROM (
    SELECT col1 AS col1A FROM table1
    UNION 
    SELECT col1 AS col1B FROM table2
) AS t WHERE col1A <> col1B

我在两个表中都有一个名为col1的列,我只需要选择具有该列不同值的行,因此我将它们选为别名。当我运行此查询时,我得到了:

Unknown column 'col1B' in 'where clause'

表1数据:

col1
----
test

表2数据:

col1
----
test

查询应该不返回任何行,因为table1中col1中的每个值都等于table2中col1中的每个值,而不是它返回table2中的col1未知,尽管我选择它作为别名

2 个答案:

答案 0 :(得分:6)

我认为您需要查找UNION的相应用法。它将返回第一个查询的所有结果以及第二个查询的所有结果。这导致单个数据集,具有单个列(不是col1和col2),在这种情况下只是col1。

假设您尝试获取table1中table2中不存在的所有记录,您可以使用NOT EXISTS

SELECT col1 
FROM table1 t1 
WHERE NOT EXISTS (
    SELECT 1
    FROM table2 t2
    WHERE t1.col1 = t2.col1
    )

答案 1 :(得分:3)

为什么OP查询返回错误1054

返回的错误是因为从UNION的结果中分配给列的名称取自第一个SELECT。

您可以通过运行一个简单示例来观察:

 SELECT 1 AS one 
  UNION
 SELECT 2 AS two 

该查询返回的结果集将包含单个列,分配给该列的名称将为one,即第一个SELECT中的列名。这解释了您从查询中收到错误的原因。


返回无匹配行的一种方法

要从col1返回table1的值col1table2 SELECT t1.col1 FROM table1 t1 LEFT JOIN table2 t2 ON t2.col1 = t1.col1 WHERE t2.col1 IS NULL 列中的任何值不匹配...

使用反连接模式的一个选项...

LEFT JOIN

table2操作返回table1中的所有行,以及table2中找到的任何“匹配”行。 “技巧”是WHERE子句中的谓词...来自table2的任何“匹配”行在col1中将具有非NULL值。因此,如果我们排除了找到匹配项的所有行,我们会留下table1中没有匹配项的行。

如果我们想要从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

(内联视图col1将被“物化”为派生表,因此这种方法对于大型集合来说可能很昂贵,而且这种方法不会利用{{1}}上的索引来执行匹配。)这和反连接方法之间的另一个小差别:如果两个表中都存在NULL,这将省略col1值为NULL。除此之外,结果集是等效的。