2011-08-08 11 views
0

これは単純なSQL照会の問題だと思いますが、この問題を解決するには、さまざまなSQL結合タイプに慣れていません。SQL照会を作成して以下を取得する方法...

私はこれらのアイテムのさまざまなitemsownersを管理するシステムを持っています。システムのuserには、ユーザーがその所有者を表示する権限を持っている場合、アイテムおよびそのアイテムの所有者に関するすべての情報を表示するためのアクセス権があります。私のスキーマは次のようになります:

Users: 
| UserId | 

Items: 
| ItemId | OwnerId | Name | Age | 

Owners: 
| OwnerId | FirstName | LastName | State | 

OwnerPermissions: 
| UserId | OwnerId | 

Itemには所有者がない可能性があります.OldIdはItemsテーブルのその行に対してNULLです。

だからエントリは、ユーザーID = 0は、私は、クエリを書きたいOwnerIdに0と1

が所有するすべてのアイテム情報を表示することができます= 0とOwnerIdに= 0とOwnerPermissionsでOwnerIdに= 1ユーザーIDのために存在している場合それがユーザID与えられ、それは、ユーザーが表示する権限を持っている所有者のために、すべての項目と所有者情報を返しとも

クエリに所有者がいないすべての項目を示しています。

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 

のGeを表示する権限を持っている人が所有しているすべてのアイテム情報が表示されますが、所有者が所有していないアイテムは失われます(OwnerIdはNULLです)。

このクエリを作成する最適な方法は何ですか?私はSQL Serverを使用していますが、私はそれに頼らない答えが好きです(しかし、SQL Serverでできることがあります)。

+0

"ANSI標準SQLでは、INNER、OUTER、LEFT、RIGHTの4種類のJOINを指定しています。" - http://en.wikipedia.org/wiki/Join_(SQL \) –

答えて

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 
関連する問題