SQL中Join与WHERE子句结合使用的问题
嗨,刚接触SQL碰到这种问题太正常了,我来给你掰扯清楚~
问题原因拆解
你遇到的两个问题本质上都是多表查询时的列归属不明确导致的:
为什么加
column1会报错?
因为column1同时存在于Data1和Data2两个表中,当你直接写SELECT column1, Data1.*的时候,数据库根本搞不清你说的column1是来自Data1还是Data2,所以就抛出了Column reference column1 is ambiguous(列引用歧义)的错误。为什么只写
Data1.*结果里没column1?
大概率是你用了JOIN类的查询,这时候结果集其实会同时包含两个表的列(包括两个column1),但有些数据库客户端会把同名列合并显示,或者你可能误判了结果;也有可能是你的关联条件写错了,导致匹配到的行本来就没有column1值,但更常见的是前者。
正确的解决方案
针对你的需求——获取Data1的所有列,只保留满足Data2条件的行,推荐两种简单靠谱的写法:
方法一:用EXISTS子查询(最推荐)
这种方式只关注Data1的行,通过子查询判断对应的Data2行是否满足条件,不会引入Data2的列,完全避免歧义:
SELECT Data1.* FROM Data1 WHERE EXISTS ( SELECT 1 FROM Data2 WHERE Data2.column1 = Data1.column1 -- 用两个表共有的column1关联 AND Data2.你的条件列 = '目标值' -- 这里替换成你需要的Data2过滤条件 );
执行后结果里只会有Data1的所有列,包括column1,不会有任何歧义问题。
方法二:用JOIN+表别名
如果你习惯用JOIN查询,记得给表起别名,明确指定列的归属:
SELECT d1.* -- 用别名d1明确取Data1的所有列 FROM Data1 d1 INNER JOIN Data2 d2 ON d1.column1 = d2.column1 WHERE d2.你的条件列 = '目标值'; -- 过滤Data2的条件
这里用d1和d2分别指代Data1和Data2,哪怕要单独选column1,只要写d1.column1就不会报错了。
小提醒
在多表查询时,永远不要直接写不带表名/别名的重复列名,一定要明确告诉数据库你要取哪个表的列。如果只需要某一个表的所有列,用表名.*或者别名.*是最省心的方式。
内容的提问来源于stack exchange,提问作者user6566791

