包含两个连接的sql查询中的模糊性

lh80um4z  于 2021-06-19  发布在  Mysql
关注(0)|答案(5)|浏览(283)

我有三张表格,结构如下:

results:
id | url_id

foo
id | url_id | url

bar
id | url_id | url

我希望能够在一个查询中选择url,知道它可以在任何一个表中。
我的计划是 LEFT JOIN 然后返回 IFNULL(foo.url, bar.url) as url .
调用结果是很重要的 url .
但是,我不能用同样的方法 url “我的”中的列名 WHERE 因为模棱两可。这是我的查询和收到的错误消息:

SELECT r.id,
COALESCE(foo.url, bar.url) as url
FROM results r
LEFT JOIN foo USING (url_id)
LEFT JOIN bar USING (url_id)
WHERE url IS NOT NULL;
``` `Column 'url' in where clause is ambiguous` 在我的代码中选择不同名称下的列并将其重命名是相当简单的,但是在sql中这样做会更好。
下面是一个sql小提琴:http://sqlfiddle.com/#!9/326/4号
干杯
3df52oht

3df52oht1#

不能使用在中声明的别名 SELECT 你方合同中的条款 WHERE 条款,因为 WHERE 以前发生过 SELECT .
因此:

SELECT r.id, COALESCE(foo.url, bar.url) as url
FROM results r
LEFT JOIN foo USING (url_id)
LEFT JOIN bar USING (url_id)
WHERE COALESCE(foo.url, bar.url) IS NOT NULL;

SELECT r.id, COALESCE(foo.url, bar.url) as url
FROM results r
LEFT JOIN foo USING (url_id)
LEFT JOIN bar USING (url_id)
WHERE foo.url IS NOT NULL OR bar.url IS NOT NULL;
2izufjch

2izufjch2#

所以你有

SELECT ..., IFNULL(foo.url, bar.url) AS url
...
WHERE url LIKE ?    ***Error: "url" ambiguous

抱歉的解决方案是使用:

SELECT ..., IFNULL(foo.url, bar.url) AS url
...
WHERE IFNULL(foo.url, bar.url) LIKE ?

它的效率不应降低。这是一个人付出的。或许以下方法可行:

SELECT ..., z.url
FROM (SELECT IFNULL(foo.url, bar.url) AS url FROM DUAL AS z)
JOIN ...
WHERE z.url LIKE ?

引入表别名以消除歧义。

ycl3bljg

ycl3bljg3#

您的问题的直接答案是在引用列时使用表别名。我把它写成一系列左连接:

SELECT
    r.id,
    r.url_id,
    COALESCE(f.url, b.url) AS url
FROM results r
LEFT JOIN foo f
    ON r.url_id = f.url_id
LEFT JOIN bar b
    ON r.url_id = b.url_id;

这个答案假设 url match可以在任一表中,或者,如果它与这两个表都匹配,那么您不介意从 foo table。

wnvonmuf

wnvonmuf4#

如果同一列名可用于多个表,则错误建议使用表别名:

select f.id, ifnull(b.url, f.url) as url
from foo f left join
     bar b
     on b.id = f.id
where f.url_id = ?;

这回答了您的问题-> Column 'url' in where clause is ambiguous 错误, JOIN s可能与您想要的不同,如果是,则调整 on 条款或提供其他条件 JOIN . 但使用别名的想法是一样的,这样可以更容易地理解查询或编译。

t40tm48m

t40tm48m5#

如果您想在可以使用子查询的位置上使用url,因为两个表都有url列,但您创建了一个,所以您必须在where中使用table.column name

select * from 
(
  SELECT r.id,
COALESCE(foo.url, bar.url) as url
FROM results r
LEFT JOIN foo USING (url_id)
LEFT JOIN bar USING (url_id)
)as t where t.url is NOT NULL

相关问题