【发布时间】:2011-07-02 17:00:24
【问题描述】:
我最近被分配了创建拍卖系统的任务。在我的工作中,我遇到了很多情况,其中包含连接的 SQL 查询由于列名不明确而无法执行。考虑一下这个(简化的)拍卖表结构:
表auction:
idname-
uid(创建拍卖的用户 ID)
表item:
idname-
uid(添加商品的用户 ID) -
aid(该物品可用的拍卖 ID) -
price(原价)
表user:
idname
表bid:
id-
uid(出价用户的 ID) -
iid(涨价商品) -
price(报价)
如您所见,有许多列的名称相互冲突。加入这些表需要使用一些可以消除歧义的措施。
我可以想到两种方法来做到这一点。首先是重命名列,在所有列前加上一个缩写的表名,这样拍卖ID将变为a_id,项目ID将变为i_id,bid表中的项目ID将变为b_i_id。这非常可靠,但会降低列名的可读性。
我能想到的另一种方法是编写显式查询:
SELECT `bid`.`id`, `user`.`name`, `bid`.`price`
FROM `bid`
JOIN `item` ON `item`.`id` = `bid`.`iid`
JOIN `user` ON `user`.`id` = `bid`.`uid`
JOIN `auction` ON `auction`.`id` = `item`.`aid`
WHERE `bid`.`price` > `item`.`price`
AND `auction`.`id` = 1
GROUP BY `user`.`id`
ORDER BY `bid`.`price` DESC;
这是可读且明确的,但需要大量额外的击键。
我使用第二种方法,但也许您在类似情况下成功使用过其他方法?如何避免 SQL 查询中的列名冲突?
【问题讨论】:
-
如果
keystrokes是您编程时的一个顾虑,您需要重新考虑您的职业道路! -
@Richard: 好的,你得到了我这个,这句话值得+1 :)
-
去掉反引号`,这些与SQL无关(检查标准!)并节省一些击键。
-
@RichardTheKiwi 不仅仅是
keystrokes;它使视图变得僵硬。在将列添加到表中但视图不会随之更新的情况下,它可以很容易地产生静默问题。我知道理论上每个人都应该一直输入所有字段,但人们经常使用自动为他们映射列的程序,例如PowerBI、EntityFramework等