以下查询引发错误[SQL0811]
它表示SELECT的结果返回多个行。但是当我单独运行查询时,它们每个键返回一行。
认为我需要另一个WHERE子句来检查表2和表1。但是,如何在SELECT外部和WHERE子句中获得对表2的可见性?
在存在之前,我尝试过这样的事情:
where a.key1 = b.key1 and a.key2 = b.key2 and a.key3 b.key3,
但是当我运行时,我得到了错误:
未定义列或全局变量'key1'
UPDATE table 1 AS a
SET (a.col1, a.col2, a.col3) = (
SELECT coalesce(b.col1, 'N'), coalesce(b.col2, 'N'), coalesce(b.col3, 'N')
FROM table 2 b
LEFT OUTER JOIN table 1 c
ON b.key1 = c.key1
AND b.key2 = c.key2
AND b.key3 = c.key3
)
WHERE (a.col1 = ' ' OR a.col2 = ' ' OR a.col3 = ' ')
AND EXISTS(
SELECT 1
FROM table c trk
INNER JOIN table d sts ON trk.key1 = sts.key1
WHERE trk.key1 = a.key1
AND sts.status IN (' ', 'REQ')
)
答案 0 :(得分:1)
我很确定您想要import React from 'react';
import * as Font from 'expo-font';
import { AppLoading } from 'expo';
import { createStore, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import AppSwitchNavigator from './navigation/AppSwitchNavigator';
export default class App extends React.Component {
state = { ... }
render() {
return (
<Provider store={store}>
<AppSwitchNavigator/>
</Provider>
);
}
}
const store = createStore(rootReducer);
const rootReducer = combineReducers({ ... });
查询的相关子查询:
set
编辑:
如果要确保UPDATE table1 a
SET (a.col1, a.col2, a.col3) = (
SELECT coalesce(b.col1, 'N'), coalesce(b.col2, 'N'), coalesce(b.col3, 'N')
FROM table2 b
WHERE b.key1 = a.key1 AND
b.key2 = a.key2 AND
b.key3 = a.key3
)
WHERE . . .;
中的子查询仅返回一行,并且列永远不SET
,请使用聚合:
NULL
答案 1 :(得分:0)
Gordon对于为什么得到SQL0811
以及如何解决问题有答案。让我们分解一下更新语句:
UPDATE table 1 AS a
SET (a.col1, a.col2, a.col3) = (
SELECT coalesce(b.col1, 'N'), coalesce(b.col2, 'N'), coalesce(b.col3, 'N')
FROM table 2 b
LEFT OUTER JOIN table 1 c
ON b.key1 = c.key1
AND b.key2 = c.key2
AND b.key3 = c.key3
)
WHERE ...
在这里,您似乎正在尝试从子查询中更新table 1
。但是,该子查询与a
没有任何关系。因此,它将返回table 2
中的所有行以及table 1
中的匹配行,其中包含没有匹配项的空值。由于table 2
中包含多行,因此您将获得SQL0811
。您需要使用相关的子查询,如Gordon建议的那样,以避免为要更新的每一行返回table 2
中的所有行。
UPDATE table 1 AS a
SET (a.col1, a.col2, a.col3) = (
SELECT coalesce(b.col1, 'N'), coalesce(b.col2, 'N'), coalesce(b.col3, 'N')
FROM table 2 b
WHERE b.key1 = a.key1
AND b.key2 = a.key2
AND b.key3 = a.key3
)
WHERE ...
但是,似乎table 2
中的每一行都没有table 1
中有一行,这就是为什么得到SQL0407
的原因。为了防止这种情况,您只需要更新table 1
中具有一行的行。这可以通过在外部WHERE子句中添加以下内容来解决:
table 2
现在,尽管您没有明确指定此设置,但是我可能会想将UPDATE table 1 a
...
WHERE (key1, key2, key3) in (SELECT key1, key2, key3 FROM table 2)
设置为(col1, col2, col3)
,如果没有('N', 'N', 'N')
行与table 2
行。由于上面的示例仅更新匹配的行,因此不会获取不匹配的行。您可以使用单独的UPDATE来执行此操作,或者,为了将这种可能性包含在与第一个UPDATE相同的更新中,您需要结合Gordon的答案和查询的修改。您仍然需要相关的子查询,并且仍然需要左联接,但是您需要table 1
中的所有行以及table 1
中的匹配行,而不是相反。看起来像这样:
table 2
为完整起见,您写道:
在存在之前,我尝试过这样的事情:
UPDATE table 1 AS a SET (a.col1, a.col2, a.col3) = ( SELECT coalesce(c.col1, 'N'), coalesce(c.col2, 'N'), coalesce(c.col3, 'N') FROM table 1 b LEFT OUTER JOIN table 2 c ON b.key1 = c.key1 AND b.key2 = c.key2 AND b.key3 = c.key3 WHERE a.key1 = b.key1 and a.key2 = b.key2 and a.key3 = b.key3 ) WHERE ...
但是当我运行时,我得到了错误:
未定义列或全局变量'key1'
这是因为where a.key1 = b.key1 and a.key2 = b.key2 and a.key3 b.key3,
仅在子选择范围内,而不能在外部where子句中找到。因此,b
没有在那里定义。如您所见,SQL错误消息并不总是最好的。