对我的数据库进行一些查询时遇到问题。我有以下表格:
该表cliente
作为我的表之一作为empleado
主键。我已将表中的属性分开,因为它们是客户和员工所拥有的属性。但这似乎不是正确的方法。我将在这里提出几个我尝试做的查询:idpersona
persona
persona(nombre, cedula, direccion)
从 2 月份购买的买家那里获得
inventa
、fecha
、importe
和。nombre
(这个查询没问题。)SELECT v.idventa, v.fecha, v.importe, p.nombre as comprador FROM ventas as v join cliente as c on v.cliente_persona_idpersona = c.persona_idpersona join persona as p on p.idpersona = c.persona_idpersona WHERE v.fecha = 'febrero'
persona
如果卖方和客户都链接到具有属性的同一个表,如何将销售人员的姓名添加到先前的查询中nombre
。根据我的模型,它不允许同一员工进行购买。换句话说,如果商店里只有一个负责销售的人,他在注册的时候突然需要买东西,如果
ventas
我的表中不能放与买家相同的卖家 ID,我应该分开一个cliente
具有他所有属性的表和empleado
具有其属性的表,即使它们等于cliente
?
换句话说,我怎样才能让卖家也可以购买并将其注册到数据库中?
添加到 Marcos Gallardo 的出色答案中,如果您不需要从表
empleado
和中返回任何特定字段cliente
,那么您不需要在查询中包含这些表。在您的情况下,您可以将查询简化为:
如果您在 中需要类似
cliente.ultima_compra
或类似的字段SELECT
,那么您确实需要将附加表添加到查询中才能访问该字段。现在,预计在某些情况下您将需要包含表
cliente
和empleado
查询,您必须承认,对这么多表进行连接会变得非常烦人。此外,虽然可以persona
在同一个查询中连接具有不同别名的表,但它可能会有点混乱,并且很容易导致错误。为了简化表的使用,您可以做的一件事是创建视图来隐藏您在表中共享客户和员工数据的事实
persona
。这样做并不违反您已付诸实践的规范化原则。例子:
这样,无论您需要什么字段,您都可以使用视图进行查询,这样就不会那么混乱了。例如,您使用视图的查询将是:
解决方案是加入 (
join
) 表empleado
和表persona
(使用另一个别名),但这个表再次指示id
员工的别名。例如,像这样:
正如@sstan 在他的评论中所说,您的表模式显然似乎没有任何限制,因此卖家也是买家应该是微不足道的。