首页 文章

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

提问于
浏览
0

我有一个简单的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 回答

  • 3

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

    假设你在table2中存在're trying to get all records in table1 that don',你可以使用 NOT EXISTS

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

    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 的值,该值与 col1col1 列中的任何值都不匹配...

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

    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 . 除此之外,结果集是等效的 .

相关问题