用于从具有多个条件的多个表中的多个列中获取数据的存储过程

     2023-05-09     281

关键词:

【中文标题】用于从具有多个条件的多个表中的多个列中获取数据的存储过程【英文标题】:stored procedure to fetch data from multiple columns in multiple tables with multiple criteria's 【发布时间】:2017-10-18 00:50:07 【问题描述】:

我在寻找什么?

创建一个存储过程来将结果写入一个表,或者最坏的情况是简化这个查询。

查询

SELECT CONCAT(ba.BRANCH_NUMBER,ba.CLIENT_ID) AS BANK_ACCOUNT_NUMBER,
bp.ORIGINAL_REGISTERED_ID,
bap.ANOTHER_COLUMN_1,
bap.ANOTHER_COLUMN_2,
bap.ANOTHER_COLUMN_3,
bap.ANOTHER_COLUMN_4,
bd.ANOTHER_COLUMN_1,
bd.REGISTERED_ID
FROM BANK_ACCOUNT_PARTNER bap,
BANK_PARTNER bp,
BANK_ACCOUNT ba,
BANKING_DATA bd
WHERE bap.PARTNER_ID=bp.PARTNER_ID
AND bap.ACCOUNT_ID=ba.ACCOUNT_ID
AND ba.REGISTERED_ID=bd.REGISTERED_ID
AND bap.ACCOUNT_ID IN
    (SELECT ACCOUNT_ID FROM(SELECT ba.ACCOUNT_ID,
    ROW_NUMBER() OVER (PARTITION BY ba.BRANCH_NUMBER, ba.CLIENT_ID ORDER BY bd.ACCOUNT_OPENED_DATE DESC) ROW_NUMBER
    FROM BANK_ACCOUNT ba,
    BANKING_DATA bd,
    ANOTHER_TABLE at
    WHERE da.REGISTERED_ID = bd.REGISTERED_ID
    AND at.REGISTERED_ID=bd.REGISTERED_ID
    AND ANOTHER_CRITERIA_COLUMN = 'someValue'
    AND ANOTHER_CRITERIA_COLUMN IN ('someValue1','someValue2','someValue3')
    AND ba.ANOTHER_CRITERIA_COLUMN='someValue'
    AND ba.ACCOUNT_MATURITY_DATE IS NULL) WHERE ROW_NUMBER='1');

提前致谢。

【问题讨论】:

问题是什么? @BaSsGaz - 我如何通过创建存储过程来简化这一点 它应该怎么做?只执行这个查询? 如问题所述,我需要将这个查询的结果写入一个表中 【参考方案1】:

对于标量查询,您可以使用CURSOR 或简单的SELECT INTO 从查询中检索结果,如下所示:

CREATE PROCEDURE myProcedure IS
        BANK_ACCOUNT_NUMBER VARCHAR(30);
        ORIGINAL_REGISTERED_ID BANK_PARTNER.ORIGINAL_REGISTERED_ID%TYPE;
        ANOTHER_COLUMN_BAP1 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_1%TYPE;
        ANOTHER_COLUMN_2 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_2%TYPE;
        ANOTHER_COLUMN_3 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_3%TYPE;
        ANOTHER_COLUMN_4 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_4%TYPE;
        ANOTHER_COLUMN_BD1 BANKING_DATA.ANOTHER_COLUMN_1%TYPE;
        REGISTERED_ID BANKING_DATA.REGISTERED_ID%TYPE;
BEGIN
    SELECT CONCAT(ba.BRANCH_NUMBER,ba.CLIENT_ID) AS BANK_ACCOUNT_NUMBER,
    bp.ORIGINAL_REGISTERED_ID,
    bap.ANOTHER_COLUMN_1,
    bap.ANOTHER_COLUMN_2,
    bap.ANOTHER_COLUMN_3,
    bap.ANOTHER_COLUMN_4,
    bd.ANOTHER_COLUMN_1,
    bd.REGISTERED_ID INTO BANK_ACCOUNT_NUMBER, ORIGINAL_REGISTERED_ID, ANOTHER_COLUMN_BAP1, ANOTHER_COLUMN_2, ANOTHER_COLUMN_3, ANOTHER_COLUMN_4,  ANOTHER_COLUMN_BD1, REGISTERED_ID
    FROM BANK_ACCOUNT_PARTNER bap,
    BANK_PARTNER bp,
    BANK_ACCOUNT ba,
    BANKING_DATA bd
    WHERE bap.PARTNER_ID=bp.PARTNER_ID
    AND bap.ACCOUNT_ID=ba.ACCOUNT_ID
    AND ba.REGISTERED_ID=bd.REGISTERED_ID
    AND bap.ACCOUNT_ID IN
        (SELECT ACCOUNT_ID FROM(SELECT ba.ACCOUNT_ID,
        ROW_NUMBER() OVER (PARTITION BY ba.BRANCH_NUMBER, ba.CLIENT_ID ORDER BY bd.ACCOUNT_OPENED_DATE DESC) ROW_NUMBER
        FROM BANK_ACCOUNT ba,
        BANKING_DATA bd,
        ANOTHER_TABLE at
        WHERE da.REGISTERED_ID = bd.REGISTERED_ID
        AND at.REGISTERED_ID=bd.REGISTERED_ID
        AND ANOTHER_CRITERIA_COLUMN = 'someValue'
        AND ANOTHER_CRITERIA_COLUMN IN ('someValue1','someValue2','someValue3')
        AND ba.ANOTHER_CRITERIA_COLUMN='someValue'
        AND ba.ACCOUNT_MATURITY_DATE IS NULL) WHERE ROW_NUMBER='1');

    INSERT INTO myTable VALUES(BANK_ACCOUNT_NUMBER, ORIGINAL_REGISTERED_ID, ANOTHER_COLUMN_BAP1, ANOTHER_COLUMN_2, ANOTHER_COLUMN_3, ANOTHER_COLUMN_4,  ANOTHER_COLUMN_BD1, REGISTERED_ID);
END;
/

或者使用CURSOR 循环:

CREATE PROCEDURE myProcedure IS
    CURSOR query IS 
        SELECT CONCAT(ba.BRANCH_NUMBER,ba.CLIENT_ID) AS BANK_ACCOUNT_NUMBER,
        bp.ORIGINAL_REGISTERED_ID,
        bap.ANOTHER_COLUMN_1 AS ANOTHER_COLUMN_BAP1,
        bap.ANOTHER_COLUMN_2,
        bap.ANOTHER_COLUMN_3,
        bap.ANOTHER_COLUMN_4,
        bd.ANOTHER_COLUMN_1 AS ANOTHER_COLUMN_BD1,
        bd.REGISTERED_ID
        FROM BANK_ACCOUNT_PARTNER bap,
        BANK_PARTNER bp,
        BANK_ACCOUNT ba,
        BANKING_DATA bd
        WHERE bap.PARTNER_ID=bp.PARTNER_ID
        AND bap.ACCOUNT_ID=ba.ACCOUNT_ID
        AND ba.REGISTERED_ID=bd.REGISTERED_ID
        AND bap.ACCOUNT_ID IN
            (SELECT ACCOUNT_ID FROM(SELECT ba.ACCOUNT_ID,
            ROW_NUMBER() OVER (PARTITION BY ba.BRANCH_NUMBER, ba.CLIENT_ID ORDER BY bd.ACCOUNT_OPENED_DATE DESC) ROW_NUMBER
            FROM BANK_ACCOUNT ba,
            BANKING_DATA bd,
            ANOTHER_TABLE at
            WHERE da.REGISTERED_ID = bd.REGISTERED_ID
            AND at.REGISTERED_ID=bd.REGISTERED_ID
            AND ANOTHER_CRITERIA_COLUMN = 'someValue'
            AND ANOTHER_CRITERIA_COLUMN IN ('someValue1','someValue2','someValue3')
            AND ba.ANOTHER_CRITERIA_COLUMN='someValue'
            AND ba.ACCOUNT_MATURITY_DATE IS NULL) WHERE ROW_NUMBER='1');
BEGIN
     FOR line IN query LOOP
        INSERT INTO myTable VALUES(line.BANK_ACCOUNT_NUMBER, line.ORIGINAL_REGISTERED_ID, line.ANOTHER_COLUMN_BAP1, line.ANOTHER_COLUMN_2, line.ANOTHER_COLUMN_3, line.ANOTHER_COLUMN_4,  line.ANOTHER_COLUMN_BD1, line.REGISTERED_ID);
     END LOOP;
END;
/

【讨论】:

感谢@BaSsGaz,关于性能 CURSOR 与 SELECT INTO 的任何建议? @Cmen535 我不知道有任何明显的性能差异!我个人使用SELECT INTO 进行这样的快速查询关联,当我需要循环结果以获得更多控制权时使用CURSOR

根据条件从多个表中获取数据

】根据条件从多个表中获取数据【英文标题】:Getdatafrommultipletablesbasedoncondition【发布时间】:2020-09-2411:13:56【问题描述】:我需要从3个不同的mysql表中获取一些数据,如下所示。+-----------------------------------+|Questions|----------------... 查看详情

在其他列中计算具有多个条件的 NaN 单列

】在其他列中计算具有多个条件的NaN单列【英文标题】:CountNaNSingleColumnwithMultipleConditionsinOtherColumns【发布时间】:2021-07-0218:34:27【问题描述】:我似乎无法通过尝试许多不同的事情来解决这个问题,而且我在网络上显然没有找... 查看详情

如何使用游标从sqlite android中的多个列中获取数据

】如何使用游标从sqliteandroid中的多个列中获取数据【英文标题】:Howtofetchdatafrommultiplecolumnsinsqliteandroidusingcursor【发布时间】:2021-09-2413:52:05【问题描述】:我想使用以下代码使用光标从多行和多列中获取数据Cursorgetallrecords()SQL... 查看详情

MYSQL - 1列中的多个所有数据在同一列中具有最大值

】MYSQL-1列中的多个所有数据在同一列中具有最大值【英文标题】:MYSQL-Multiplealldatain1columnwithmaxvalueinthesamecolumn【发布时间】:2018-05-0207:01:12【问题描述】:我在标准表中有这样的数据:+----+|c1|+----+|1||2||3||4||5|+----+我想要的只是... 查看详情

从同一个表中的多个列中选择不同的值

】从同一个表中的多个列中选择不同的值【英文标题】:Selectdistinctvaluesfrommultiplecolumnsinsametable【发布时间】:2012-07-0309:29:15【问题描述】:我正在尝试构建一个SQL语句,该语句从位于同一个表中的多个列返回唯一的非空值。SELE... 查看详情

数据库:如何从具有一个公共列的两个表中获取多个值

】数据库:如何从具有一个公共列的两个表中获取多个值【英文标题】:Database:howtogetmultiplevaluesfromtwotableshavingonecommoncolumn【发布时间】:2018-09-3017:29:05【问题描述】:我有两个两张表:表#1:列ProducerConsumerKeytimeresourcepathDay------... 查看详情

在多表列中具有多个术语的简单 PHP 过滤器

】在多表列中具有多个术语的简单PHP过滤器【英文标题】:SimplePHPfilterwithmultipletermsinmultitablecolumns【发布时间】:2018-05-1403:34:25【问题描述】:我正在尝试实现一个搜索过滤器,该过滤器从mysql获取数据并应用多个条件,例如从... 查看详情

MySQL从具有条件的多个表中选择

】MySQL从具有条件的多个表中选择【英文标题】:MySQLselectfrommultipletablewithconditions【发布时间】:2012-04-2714:39:40【问题描述】:我有4张桌子:ARTICOLEBARBUCATARIEMAGAZIEmysql>select*fromARTICOLE;|OID|ART||1|TEST||2|TESTQ||3|MYART||4|MYARTBUC|4行(0.00... 查看详情

如何使用 ADO.NET 从具有一对多关系的 DAL 层中的多个表中返回数据

】如何使用ADO.NET从具有一对多关系的DAL层中的多个表中返回数据【英文标题】:HowtoreturnDatafrommultipletablesinDALlayerwithone-to-manyrelationshipusingADO.NET【发布时间】:2016-04-2815:33:58【问题描述】:我在数据库中有一个customer表和orders表... 查看详情

Oracle SQL 查询从一行中的多个列中获取最新数据

】OracleSQL查询从一行中的多个列中获取最新数据【英文标题】:OracleSQLQuerytogetLatestDatafrommultiplecolumnsinonerow【发布时间】:2020-04-1607:35:57【问题描述】:我有这样的表MY_TABLE,它存储来自许多表的更改数据(更新跟踪)。因此,... 查看详情

归一化具有多个条件的数据帧,R

】归一化具有多个条件的数据帧,R【英文标题】:Normalizingadataframehavingseveralconditions,R【发布时间】:2019-09-2607:00:09【问题描述】:我有一个数据框(df),其中包含NA和数字。我想在以下条件下对其进行规范化:如果列仅包含NA,... 查看详情

用于在 Spring Data Jpa 中从多个表中获取数据的自定义查询

】用于在SpringDataJpa中从多个表中获取数据的自定义查询【英文标题】:CustomQueryforfetchingdatafrommultipletablesinspringDataJpa【发布时间】:2017-08-1200:18:15【问题描述】:实体正在关注产品表@EntitypublicclassProductimplementsSerializable/*@Id@Generat... 查看详情

如何根据多个条件从 SQL Server 中删除大量数据

】如何根据多个条件从SQLServer中删除大量数据【英文标题】:HowtodeletelargevolumeofdatafromSQLServerbasedonmultiplecondition【发布时间】:2020-12-3107:10:58【问题描述】:我正在寻找一个SQL查询,我必须根据2个条件的组合从表中删除数据。我... 查看详情

用于以任何出现顺序匹配具有多个单词的列中的字符串的 Coredata 谓词

】用于以任何出现顺序匹配具有多个单词的列中的字符串的Coredata谓词【英文标题】:Coredatapredicateformatchingstringsincolumnswithmultiplewordsinanyorderofoccurrence【发布时间】:2019-01-2309:46:33【问题描述】:我想编写一个CoreData谓词来检查一... 查看详情

从具有多个分区列的配置单元表中获取最新数据(代码片段)

我有一个具有以下结构的配置单元表IDstring,Valuestring,yearint,monthint,dayint,hourint,minuteint此表每15分钟刷新一次,并按年/月/日/小时/分钟列划分。请在分区上找到以下示例。year=2019/month=12/day=29/hour=19/minute=15year=2019/month=12/day=30/hour=00/mi... 查看详情

根据单个列中的多个条件选择多个列

】根据单个列中的多个条件选择多个列【英文标题】:Selectmultiplecolumnsbasedonmultipleconditionsfromsinglecolumn【发布时间】:2021-12-1106:02:44【问题描述】:我在数据库中有一个表,其中存储了金额、它们各自的“发票日期”以及这些发... 查看详情

在具有分页的单个模型查询代码点火器中获取具有多个条件的多个连接结果

】在具有分页的单个模型查询代码点火器中获取具有多个条件的多个连接结果【英文标题】:Fetchmultiplejoinresultwithseveralconditioninasinglemodelquerycodeigniterwithpagination【发布时间】:2016-04-2711:42:06【问题描述】:这是我正在工作的模型... 查看详情

从 Hive 中的多个表中选择增量数据

】从Hive中的多个表中选择增量数据【英文标题】:selectingincrementaldatafrommultipletablesinHive【发布时间】:2017-07-2612:23:48【问题描述】:我在Hive数据库中有五个表(A、B、C、D、E),我必须根据列“id”上的逻辑来合并这些表中的数... 查看详情