sql 关联查询外键为空的情况
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 关联查询外键为空的情况相关的知识,希望对你有一定的参考价值。
表A:id, p1(与B关联), p2(与B关联)
表B:id
B有一条记录
id p
1 s
A有一条记录
id p1 p2
1 1 NULL
怎么查A这条记录,级联查询,查询结果
A.id p1.id p1.p p2.id p2.p
1 1 s NULL NULL
如A表字段 a,b(外键),c;B表字段:b,d
select A.*,d from A left join B on A.b=B.b
如果查询外键不为空的数据 可以加where条件
select A.*,d from A left join B on A.b=B.b where B.b is not null 参考技术A select t1.a,t1.b,t2.a,t2.c from talbe1 t1 left join table2 t2 on t1.a=t2.a
where t2.a is null
这句SQL的意思为,从table1和table2两个表查询,其中t1.a为table1的主键,t2.a为外键,
当外键t2.a不存在,则对应t1的资料显示出来。 参考技术B 表A:id, p1(与B关联), p2(与B关联)
表B:id
B有一条记录
id p
1 s
A有一条记录
id p1 p2
1 1 NULL
怎么查A这条记录,级联查询,查询结果
A.id p1.id p1.p p2.id p2.p
1 1 s NULL NULL
select a.id, p1.id, p1.p, p2.id, p2.p
from a left join b p1 on a.p1=p1.id left join b p2 on a.p2=p2.id 参考技术C select A.id , p1.id , p1.p , p2.id , p2.p
from A left join B
on A.p1=B.id 参考技术D SELECT A.id,b.id,a.p1,a.p2,b.p FROM 表A a
inner join 表B b on a.id=b.id
group by A.id,b.id,a.p1,a.p2,b.p
获取请求导致父管理对象的外键为空
【中文标题】获取请求导致父管理对象的外键为空【英文标题】:Fecth request causes the foreign key of parent manage object to be null 【发布时间】:2013-11-06 23:53:48 【问题描述】:我有两个有关系的实体。一个父母和一个孩子(对许多人)。我第一次取它是好的。第二次调用获取请求时,父级的引用键被删除/为空,从而使子记录成为孤儿。
- (void)prepareGallery
self.events = [[NSMutableArray alloc] init];
self.photos = [[NSMutableArray alloc] init];
NSArray *tempArr = [self fetchEntity:@"PEvent" predicate:nil];
for (Event *pEvent in tempArr)
NSSet *photoSet = [pEvent photos];
NSArray *photosArray = [photoSet allObjects];
if ([photosArray count] > 0)
//only add events with photos
[self.events addObject:pEvent];
[self.photos addObject:photosArray];
if ([self.events count] > 0)
[collectionView reloadData];
else
NSLog(@"Events empty");
-(NSArray*)fetchEntity:(NSString*) entityName predicate:(NSPredicate*) predicate
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
request.resultType = NSManagedObjectResultType;
if (predicate != nil)
request.predicate = predicate;
NSError *error;
NSArray *result = [_managedObjectContext executeFetchRequest:request error:&error];
return result;
模型关系
实体:照片 目的地:PEvent 逆:照片 删除规则:无操作 类型:一个
实体:PEvent 目的地:照片 逆:pEvent 删除规则:级联 类型:对许多
【问题讨论】:
【参考方案1】:几个问题。您的阵列设置不是最佳的。通过创建两个包含事件和照片的单独数组你正在破坏这种关系。
这里的关键是完全消除这些人工制品。如果需要,您可以获取所有事件并将它们保存在一个数组中,但当然使用NSFetchedResultsController
为您提供对象会更加健壮。
如果你使用数组,你所需要的只是事件数组。如果对于您的收藏视图数据源,您需要事件的照片数量,那么就像event.photos.count
一样简单。
您在设置例程中执行了一系列完全不必要的操作:
例如您获取所有事件,然后在循环中将它们过滤到一个新数组中。您可以在获取请求中使用谓词。
此外,您将照片NSSet
转换为一个数组(具有随机顺序),这也是不必要的。如果您需要按顺序排列照片,时间戳之类的东西似乎最合适。
【讨论】:
以上是关于sql 关联查询外键为空的情况的主要内容,如果未能解决你的问题,请参考以下文章