【问题标题】:sql newbie trying to cross reference data in two tablessql新手试图交叉引用两个表中的数据
【发布时间】:2013-02-22 20:57:49
【问题描述】:

我有两张桌子,DATA_TABLEERROR_TABLEDATA_TABLE 有一列 ID 有一个 8 位数字。 ERROR_TABLE 有一个 KEY 列,idkey= 后跟八位数字。

我不能使用相交,因为元组不同,我不知道如何解决它。

我需要在DATA_TABLE 中找到与KEY 列中ERROR_TABLE 中的值相对应的ID 列中的值的行。

这是一个视觉效果。我需要查看其中哪些匹配并显示DATA_TABLE中的那些行

DATA_TABLE
  ID
  24294857
  19573859
  49205983

ERROR_TABLE
  KEY
  idkey=24294857
  idkey=66849896
  idkey=94697356

【问题讨论】:

  • 您使用的是什么数据库平台? SQL Server、Oracle、MySQL、Postgres...?

标签: sql oracle cross-reference


【解决方案1】:

我会使用简单的内部连接

select * 
from DATA_TABLE 
inner join ERROR_COLUMN  
   on DATA_TABLE.ID = ERROR_TABLE.KEY

【讨论】:

    【解决方案2】:
    select dt.* 
    from data_table dt 
    join error_table et 
       on et.idkey = dt.id
    

    【讨论】:

      【解决方案3】:

      类似于 PM 77-1,但使用显式连接:

      SELECT *
        FROM DATA_TABLE
        JOIN ERROR_TABLE
          ON 'idkey=' || ID = KEY;
      

      见:http://sqlfiddle.com/#!4/dbe73/3

      【讨论】:

        【解决方案4】:

        你的意思是这样的吗?

        SELECT * FROM DATA_TABLE d, ERROR_TABLE e
        WHERE ('idkey='||d.id = e.key)
        ORDER BY DATA_TABLE.id
        

        【讨论】:

        • @a_horse_with_no_name - 谢谢。固定。
        【解决方案5】:

        最好的办法是更正错误表中的数据。这些示例将仅剪切文本留下数字。您可以使用 TO_NUMBER() 函数将它们显式转换为数字以加入和比较。您已经有很多连接示例。但在加入前需要将两边都转换成数字,截掉数字前面的字符:

        -- This example assumes you will always have '=' in your string --
        SELECT SUBSTR('idkey=24294857', INSTR('idkey=24294857', '=')+1) digits_only 
          FROM dual
        /
        
        SELECT regexp_replace('idkey=24294857','[^0-9]') digits_only 
          FROM dual; 
        /
        
        SELECT REGEXP_SUBSTR('idkey=24294857','[[:digit:]]+') AS digits_only FROM dual
        /
        

        在此之后,您的查询将在连接中将数字与数字进行比较,这是唯一正确的做法。

        【讨论】:

          【解决方案6】:

          感谢大家的帮助!

          我尝试了每一个建议,但都无法奏效。我对 SQL 非常熟悉,只懂一些命令。

          最后,我从同事那里得到了这个,它完成了我所需要的。现在,我只需要了解它...

          SELECT *
          FROM DATA_TABLE
          WHERE EXISTS 
                  (SELECT NULL
                     FROM ERROR_TABLE
                    WHERE ID = SUBSTR(ERROR_TABLE.KEY,7));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-14
            相关资源
            最近更新 更多