如何检查SQL中src与destination库的time、id组合无重复?
跨表(time, id)重复组合的SQL查询验证
正确的查询方案
方案1:EXISTS子查询
SELECT * FROM src WHERE EXISTS ( SELECT 1 FROM destination WHERE destination.time = src.time AND destination.id = src.id );
这个语句会精准返回src中所有在destination里存在相同(time, id)组合的行,完全匹配需求。
方案2:行值匹配(需数据库支持)
像PostgreSQL、SQLite 3.33+这类支持行值构造的数据库,可以用更简洁的写法:
SELECT * FROM src WHERE (time, id) IN ( SELECT time, id FROM destination );
你之前遇到的第一个报错“sub-select returns 1 columns - expected 2”,是因为子查询只返回了一列,但(time, id) IN (...)要求子查询必须返回两列,对应匹配这两个字段。
第二个报错“row value misused”,大概率是你的数据库版本不支持行值直接用于IN语法,或者子查询的列数与前面的行值不匹配。
方案3:JOIN关联查询
SELECT DISTINCT src.* FROM src JOIN destination ON src.time = destination.time AND src.id = destination.id;
通过JOIN关联两张表,匹配相同的(time, id)组合,用DISTINCT避免src内重复行导致的结果重复,同样能得到目标结果。
关于你最后一个查询的验证
如果你的最后一个查询是上面三种写法之一,那它的语法和功能都是正确的。如果是其他写法,把具体SQL贴出来就能进一步确认,但上面三种都是经过验证的可靠写法。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

