如何编写SQL查询以获取以下内容...

时间:2011-08-08 18:12:22

标签: sql

我认为这是一个简单的SQL查询问题,但我对不同的SQL连接类型不够熟悉,无法获得此问题的最佳解决方案。

我有一个管理这些项目的各种itemsowners的系统。如果用户有权查看该所有者,则user系统有权查看有关项目和所有者的所有者的所有信息。我的架构如下:

Users:
| UserId |

Items:
| ItemId | OwnerId | Name | Age |

Owners:
| OwnerId | FirstName | LastName | State |

OwnerPermissions:
| UserId | OwnerId |

Item可能没有所有者 - 那么Items表中的那行的OwnerId为NULL。

因此,如果在OwnerPermissions中存在UserId = 0且OwnerId = 0且OwnerId = 1的条目,则UserId = 0可以查看OwnerId 0和1拥有的所有项目信息。

我想写一个给定userId的查询,它返回用户有权查看的所有者的所有项目和所有者信息,并显示所有没有所有者的项目 < / p>

查询:

select Items.*, Owners.* 
from Items
inner join Owners on Items.OwnerId = Owners.OwnerId
inner join OwnerPermissions on OwnerPermissions.OwnerId = Owners.OwnerId
where OwnerPermissions.UserId = $userId

获取我有权查看的人拥有的所有项目信息,但它错过了不属于任何人的项目(OwnerId为NULL)。

编写此查询的最佳方法是什么?我使用的是SQL Server,但我更喜欢不依赖它的答案(但如果有一个SQL Server可以做的巧妙的技巧,我会感兴趣)

1 个答案:

答案 0 :(得分:1)

将其更改为LEFT JOIN并显示每个项目,如果没有所有者,则显示NULL

select Items.*, Owners.* 
from Items
left join Owners on Items.OwnerId = Owners.OwnerId
left join OwnerPermissions on OwnerPermissions.OwnerId = Owners.OwnerId
where OwnerPermissions.UserId = $userId