2011-11-22 74 views
3

所以假设我有此查询使SQL子查询不停抱怨重复列

SELECT COUNT(*) FROM (SELECT * FROM k JOIN j ON k.id = j.aid) k 

假设K和J具有相同名称的两列,这样整个查询将与重复列错误抱怨....

而简单地执行SELECT * FROM k JOIN j ON k.id = j.aid将执行,尽管重复列就好了....

我知道,你可以使用子查询用来指定重复的情况下要使用的列,但有什么办法指定该查询以便它自动地为特定的列(无论是随机的还是使用任何规则)映射以便在重复的情况下使用,而不必手动指定它们?

ie即使没有修改子查询(SELECT * FROM k etc),只修改superquery(SELECT COUNT(*)FROM ...)并使其尽可能抽象,这样它就可以工作,而不管什么子查询

+4

我同意@JoeStefanelli。这不是使用'SELECT *'的最佳实践之一 - 即使有时候你需要所有的列。但是,在手边的事情要注意..你有没有试过'SELECT COUNT(1)。 ..'?你在列模糊不清中遇到错误的一个原因是,当你将子查询包含在表中时,你有点触发了规则的执行。类似于我们在创建新表格时不能添加两个同名的列。我不知道如何让你的查询不会像当前构建的那样抛出错误。 – Nonym

回答

3

在这个例子中,最简单的解决方案将是,以取代* 1在子查询。替换单个字符是否真的有问题?

1

为什么不

SELECT COUNT(*) FROM k JOIN j ON k.id = j.aid 

子查询重复的列的其他的RDBMS发生得。

个人,为什么你在两个表中都有id列?而不是孩子,吉德。根据表格,这可能是DRY和OO思维,但对SQL来说完全没用。参见bunfights在"Why is naming a table's Primary Key column “Id” considered bad practice?"

+0

因为子查询可能在它们中有组bys,并且SELECT COUNT(*)将由组执行COUNT(*)而不是总行数 –

+2

@kamikaze_pilot:在这种情况下,您不会有'SELECT *',对吗? – gbn