使用mysql中不同表的多个列连接

时间:2017-10-26 23:45:32

标签: mysql

Big_Table拥有数百万条记录。 Little_Table是一个将重新格式化和导入的电子表格,有大约25,000条记录。这些表共享一些需要匹配的常见且相似但表达不同的列,它们是:

Big_Table
  • 常见栏目: instr 日期 ts
  • 示例数据:SPY20170602PUT241, 2017-06-01 09:21:20.107, 09:21:00.935

Little_Table

  • 常用列:工具日期时间
  • 示例数据:SPY20170602PUT241, 6/1/2017, 9:21:00

目标是从Big_Table中检索匹配* Little_Table的记录。为此,我需要指导,如果有必要,构建/重新格式化一些Little_Table列,然后进行查询以完成工作。请指教。 *匹配是这三个标准对于每个表中的一行是真实的:

- instr and instrument are the same exact string

 - date and Date indicate the same mm/dd/yyyy

 - ts and time indicate the same hh/mm/ss

2 个答案:

答案 0 :(得分:0)

根据我的理解,这是对多个conditios的简单连接,请尝试以下示例:

SELECT * FROM Big_Table JOIN Little_Table ON (instr=instrument AND date=Date AND ts=time) WHERE ....

答案 1 :(得分:0)

这对我有用。我使用自定义列 trade_name 创建了一个新的Big_Table修改版本。我使用自定义列 trade_name 创建了Little_Table,专门用于匹配。我怀疑这是最好的解决方案,但它确实奏效了。以下是详细信息:

* trade_name ,工程专栏,将最初不匹配格式的三个匹配标准和每个表中的单独列组合成一个 格式化规范化,连接字符串(日期+时间+仪器)。即对于每个表格,将表示日期,时间和工具的列连接到 trade_name 列,格式相同。

  1. 创建Big_Table_New:我使用了Big_Table的CREATE TABLE语句,称之为" Big_Table_New",删除了键,添加了列"商品名" ,使其成为表的索引,然后使用以下语句填充数据:

    INSERT INTO Big_Table_New 
    SELECT *, CONCAT_WS(' | ',instr,DATE(date),TIME_FORMAT(ts,'%T')) 
    FROM Big_Table 
    WHERE date>='2017-06-01 00:00:00' AND date<'2017-06-02 00:00:00' 
    AND instr IN (SELECT instrument FROM instruments);
    

    我只需要2017年6月份的记录,作为解决方法,我在每月的每一天重复查询一次,而不是一次性选择整个月,因为查询已经超时了特别是六月的一天。继续......

  2. 创建Little_Table:首先,我使用CREATE TABLE Little_Table语句来创建表模式。我为trade_name包含了一个列,并将其作为索引。然后我加载了csv文件,使用SET在同一步骤中对trade_name应用格式修改和连接。

    LOAD DATA LOCAL INFILE 'C:\\myfilepath\\Little_File.csv' 
    INTO TABLE Little_Table
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (l_instr, @l_date, @l_ts, l_prc, l_side, l_qty, trade_name)
    SET 
      l_date = DATE_FORMAT(STR_TO_DATE(@l_date, '%m/%d/%Y'), '%Y-%m-%d'),
      l_ts = TIME_FORMAT(DATE_SUB(STR_TO_DATE(@l_ts, '%H:%i:%s'), INTERVAL 1 HOUR),'%T'),
      trade_name = CONCAT_WS(' | ',l_instr,l_date,l_ts);   
    
  3. 最终查询使用了以下语句:

    SELECT *
    FROM Big_Table_New, Little_Table_New 
    WHERE Big_Table_New.`trade_name` = Little_Table_New.`trade_name`; 
    

    查询耗时约150秒,这已经足够了。