如何解决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(此处将删除匹配但on
与valy
不匹配的行):
{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中的一行匹配,但没有匹配项符合您指定的条件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。