我创建了一个小的映射表,用于将值与另一个表中的值相关联。当我执行选择时,我得到400万reocrds~。
我知道这一定是我正在做的微不足道的事情。如果有人可以感激A)告诉我我做错了什么B)告诉我我应该读什么文学所以我理解这些问题:)(网站,书籍等)。
select u.uid,
l.catid
from usersmap u,
locmapping l
where u.prodid = l.prodid
抱歉,我要回来的额外数据我假设它以某种形式重复。查询尝试执行的操作是获取用户ID和产品ID。我正在尝试将产品ID替换为来自另一个表的类别ID。
数据库结构如下
我遇到的旧情况只是从用户地图中选择prodid,uid
但是现在我想把它变得与catid相等。我使用locmapping来创建这些映射(理论上:) :)
答案 0 :(得分:1)
SQL在语义上是正确的。如果您获得的记录数超出预期,则最有可能是因为您需要向WHERE子句添加第二对列以进一步限制两个表之间“匹配”的记录,或者限制从其中一个表中考虑的记录表到子集(可能是找到的当前或最近的记录)。
如果没有更完整的问题描述,表结构以及理想情况下的一些样本数据,任何进一步的猜测是不可能的。
答案 1 :(得分:1)
从这些表格结构看,类别和产品之间以及用户和产品之间存在多对多的关系。
如果是这样,一个用户可以通过许多产品映射到一个类别,这就是为什么有这么多额外的行 - 在这种情况下,答案只是将DISTINCT添加到查询中,如下所示:
select DISTINCT u.uid, l.catid
from usersmap u, locmapping l where u.prodid=l.prodid
答案 2 :(得分:1)
如果是SELECT prodid,则uid FROM usermap会产生500K行,但问题中的SQL会产生400万行,这意味着在表定位的8行中找到(平均)prodid的每个值。这导致原始的500K行乘以8,并且这些行将以各种catid值返回。
如果locmapping旨在为每个prodid提供单个catid,则应使用UNIQUE索引保护该表中的prodid列。
答案 3 :(得分:0)
转到SQL School: http://www.w3schools.com/sql/default.asp
不知道你们各自有多少行,很难知道你是否做错了。即如果表A中有400万条记录,并且它们也都在表B中(根据您加入的字段),那么您将获得400万条记录!
此外,这只是一个SQL问题,与网站无关。
答案 4 :(得分:0)
如果没有数据模型,很难分清问题所在。也许你误解了内连接是如何工作的?
您的查询正在使用内部联接。这意味着必须有400万个交叉路口。 Usersmap可能有500,000行,但如果其中一行的prodid包含在locmapping中的多行中,那么每个交集都会得到一行。