更新SQL获取选择多个行

时间:2019-12-12 23:19:16

标签: sql db2-400

以下查询引发错误[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')
    )

2 个答案:

答案 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错误消息并不总是最好的。

相关问题