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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值