从具有人类类别的表中进行选择

时间:2014-12-01 18:21:22

标签: sql sql-server

我在ms sql中创建了一个数据库,在数据库中我有三类人员,即员工,客户,供应商,我存储在不同的表中为每个表创建序列唯一ID。

现在这些人员ID存储在person_id和列名人员类型中,该人员类型存储了交易表中的员工,custimer或供应商,问题在于从事务表中选择记录,如此伪代码

Select t.*,s.na as staff,sp.name as supplier, c.name as customer
From Trans t 
left join Staff s on s.id = t.pid
left join Suppliers sp on sp.id = t.pid
left join Customers c on c.id = t.pid

这将返回一行,而不是至少3行或更多,如何解决此问题

我的转换表

person_id    Person_type    Trans_id
1            staff            1
1            customer         2
2            customer         3
3            suppler          4
1            staff            5

预期输出

person_name      Trans_id
james            1
mark             2
dan              3
jude             4
james            5

员工,客户和供应商存储在不同的表格中

1 个答案:

答案 0 :(得分:1)

这就是Join的作用,将来自多个表的数据合并到一个结果行中。如果你想"保留行",而不是组合它们,你可以使用UNION

(
    Select t.* From Trans t 
    left join Staff s on s.id = t.pid
)
UNION
(
    Select t.* From Trans t 
    left join Suppliers sp on sp.id = t.pid
)
UNION
(
    Select t.* From Trans t 
    left join Customers c on c.id = t.pid    
)

这将为您提供您想要的多行但仍然不确定您是否正确定义了它。我看到你只是从Trans获取列,所以你没有从其他表中获取任何数据。并且您正在进行左外连接,因此其他表格不会影响选择。所以我认为它与从Trans。中选择一样。

如果您想要的是来自Trans的数据,其他表中有相应的条目,那么请执行UNION,同时将外部联接更改为内部。