我有三张表格,结构如下:
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号
干杯
5条答案
按热度按时间3df52oht1#
不能使用在中声明的别名
SELECT
你方合同中的条款WHERE
条款,因为WHERE
以前发生过SELECT
.因此:
或
2izufjch2#
所以你有
抱歉的解决方案是使用:
它的效率不应降低。这是一个人付出的。或许以下方法可行:
引入表别名以消除歧义。
ycl3bljg3#
您的问题的直接答案是在引用列时使用表别名。我把它写成一系列左连接:
这个答案假设
url
match可以在任一表中,或者,如果它与这两个表都匹配,那么您不介意从foo
table。wnvonmuf4#
如果同一列名可用于多个表,则错误建议使用表别名:
这回答了您的问题->
Column 'url' in where clause is ambiguous
错误,JOIN
s可能与您想要的不同,如果是,则调整on
条款或提供其他条件JOIN
. 但使用别名的想法是一样的,这样可以更容易地理解查询或编译。t40tm48m5#
如果您想在可以使用子查询的位置上使用url,因为两个表都有url列,但您创建了一个,所以您必须在where中使用table.column name