Allays从联接中的左表返回值

问题描述

我有2张桌子 A和B

A具有cols(AKey,val1,val2) B具有Cols(BKey,Akey,ValX,valY)

我有以下查询

    select a.Val1,a.Val2,b.ValX
    from A
    Left Join B on a.AKey = b.Akey
    where a.Akey ={someValue}
    and ((b.valY ={aDifferentVal}) or (b.valY is NULL))

这种情况是我一直想返回表A中的值。 并且当联接中存在{aDifferentVal}时,此方法有效;当表B中没有用于Join的值时,该方法也适用;但是,当表be中具有联接的值,但都不是{aDifferentVal}时,则查询有效什么也不返回,我仍然想要表A中的值。

我该如何实现?

解决方法

只需将x表上的条件从连接的left join子句移到where子句-否则它们变为强制性的,并且对未填充的行进行归档out(此处将删除匹配但onvaly不匹配的行):

{adifferentval}
,

second 表上的条件移至#[allow(clippy::single_match)] fn set_focus(&mut self,window: xproto::Window) { if window != self.root && window != self.focus { let prev = self.focus; // ungrab focus from the previous window xproto::ungrab_button( self.conn,xproto::BUTTON_INDEX_1 as u8,self.focus,0 ); // make sure we don't accidentally have button 1 grabbed xproto::ungrab_button( self.conn,window,0 ); // See https://github.com/i3/i3/blob/b61a28f156aad545d5c54b9a6f40ef7cae1a1c9b/src/x.c#L1286-L1337 if self.needs_take_focus(window) && self.doesnt_take_focus(window) && window != base::NONE && window != self.root { let client_message = xproto::ClientMessageEvent::new( 32,self.atom("WM_PROTOCOLS"),xproto::ClientMessageData::from_data32( [ self.atom("WM_TAKE_FOCUS"),self.last_timestamp,0 ] ) ); xproto::send_event(self.conn,false,base::NONE as u32,&client_message); } else { debug!("{} can be focused normally",window); xproto::set_input_focus( self.conn,xproto::INPUT_FOCUS_PARENT as u8,); } self.replace_prop( self.root,self.atom("_NET_ACTIVE_WINDOW"),32,&[window] ); debug!("updating _NET_WM_STATE with _NET_WM_STATE_FOCUSED!"); self.remove_prop(prev,self.atom("_NET_WM_STATE"),self.atom("_NET_WM_STATE_FOCUSED")); self.append_prop(window,self.atom("_NET_WM_STATE_FOCUSED")); self.focus = window; debug!("focused window: {}",self.focus); } else if window == self.root { self.remove_prop(self.focus,self.atom("_NET_WM_STATE_FOCUSED")); debug!("focusing root -> NONE"); self.replace_prop(self.root,&[base::NONE]); xproto::set_input_focus(self.conn,base::NONE,base::CURRENT_TIME); self.focus = xcb::NONE; } } fn append_prop(&self,window: xproto::Window,prop: u32,atom: u32) { // TODO: Check result xproto::change_property( self.conn,xproto::PROP_MODE_APPEND as u8,prop,xproto::ATOM_ATOM,&[atom] ); } fn remove_prop(&self,atom: u32) { let cookie = xproto::get_property(self.conn,xproto::GET_PROPERTY_TYPE_ANY,4096); match cookie.get_reply() { Ok(res) => { match res.value::<u32>() { [] => {},values => { let mut new_values: Vec<u32> = Vec::from(values); new_values.retain(|value| value != &atom); self.replace_prop(window,&new_values); },} },Err(err) => error!("couldn't get props to remove from: {:#?}",err),} } fn needs_take_focus(&self,window: xproto::Window) -> bool { let properties_cookie = xproto::get_property( self.conn,xproto::ATOM_ANY,2048 ); match properties_cookie.get_reply() { Ok(protocols) => { let mut needs_help = false; for proto in protocols.value::<u32>().iter() { match self.atom_by_id_checked(proto) { Some("WM_TAKE_FOCUS") => { needs_help = true },_ => (),} } needs_help },// FIXME Err(_) => false,} } fn doesnt_take_focus(&self,window: xproto::Window) -> bool { match xcb_util::icccm::get_wm_hints(self.conn,window).get_reply() { Ok(hints) => { if let Some(input) = hints.input() { input } else { false } },} } 子句:

on

select a.Val1,a.Val2,b.ValX from A Left Join B on a.AKey = b.Akey and (b.valY ={aDifferentVal}) where a.Akey = {someValue} 子句中的过滤(某种)将外部联接转换为内部联接。您的版本稍好一点,因为它正在检查where。但是,匹配的行是:

  • 在B中完全不匹配的A值。
  • 符合您指定条件的A值。

过滤掉的是A值,该值与B中的一行匹配,但没有匹配项符合您指定的条件。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...