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 关联查询外键为空的情况的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis - 关联查询

sql查询未被外键关联的数据

hibernate 一对多双向关联 外键值为空 怎么结决?

Hibernate一对多关联关系保存时的探究

mysql多表关联查询字段为空

sql 语句查询判断是不是为空并关联