【问题标题】:SQL match between two tables and further match between columns两个表之间的 SQL 匹配和列之间的进一步匹配
【发布时间】:2017-12-16 01:58:01
【问题描述】:

我有两个表:主数据和样本数据。

主数据包含“Key”、“from date”、“to date”、“PayTM”列

示例数据包含“Key”、“creation date”、“PayTS”列

我正在尝试获取执行此操作的代码:

  1. 对于两个表之间的每个“键”匹配>

  2. 确定“创建日期”是否介于“开始日期”和“截止日期”之间 >

  3. 如果是,请显示匹配/记录(来自示例数据表),包括 PayTM 和 PayTS。 如果否,则不显示记录。 (并通过执行第 2 步和第 3 步的所有比赛)

这是我目前所拥有的,但它显示的记录不匹配...我尝试将 WHERE NOT EXISTS 替换为 EXISTS,但它给了我一个错误。我的 sql 编码技能非常基础,出于某种原因,我正在努力让代码通过此操作。

SELECT cd.*
FROM [Sample Data] as cd
WHERE NOT EXISTS (SELECT 1
              FROM [Master Data] as md
              WHERE cd.Key = md.Key AND
                    md.[Creation Date] BETWEEN md.From Date and md.To Date
             );

【问题讨论】:

  • 了解连接

标签: mysql sql ms-access


【解决方案1】:

您的问题可以通过简单的加入来解决。比如:

SELECT cd.* , md.*
FROM [Sample Data] as cd, [Master Data] as md
 WHERE cd.Key = md.Key AND
                    cd.[Creation Date] BETWEEN md.[From Date] and md.[To Date];

注意:上面的查询是伪查询,只是为了突出想法。

【讨论】:

  • 当我尝试应用此解决方案时,它会提取“Key”和日期之间匹配的所有数据记录。我只需要它从样本数据中提取那些匹配的记录,但也只需要从主数据中包含“PayTM”。我是否可以通过说 SELECT cd.*, md.[PayTM] 来做到这一点?
  • 另外,如果我想添加一个包含该查询的列,该查询将查看“PayTS”和“PayTM”,如果这两个匹配它会说“是”,如果它们不匹配它会说“不”....可以用 sql 做到这一点吗?
  • @KateLO 您可以简单地使用md.PayTM 是选择部分而不是md.*。如果您可以共享确切的查询,那么我可以对其进行修改。我不认为 OP 中显示的查询是写的,因为它在 md 中引用了[Creation Date],这是不正确的。
  • 我刚刚测试了您提供的代码并且它有效,我现在唯一想弄清楚的是如何让代码为比较 PayTM 和 PayTS 的每条记录添加一个新列值和如果它们匹配,它会说“是”,如果不是“否”。这必须是代码的附加内容还是完全不同的东西?
  • @KateLO 您可以在选择部分中使用 CASE 语句。类似于 `SELECT cd.*, CASE when md.PayTM = cd.PayTS then 'Yes' ELSE 'No' END as SameValue FROM [Sample Data] as cd, [Master Data] as md WHERE cd.Key = md.Key AND cd.[Creation Date] BETWEEN md.[From Date] and md.[To Date];'
【解决方案2】:

我认为这应该处理它。

select
        x.key_
       ,x.paytm
       ,x.payts
from(
    select
            md.key   as key_
           ,cd.paytm as paytm
           ,cd.payts as payts
           ,case when md.creation_date between md.from_date and md.to_date
                 then 'goodie'
                 else 'baddie'
            end as the_test  

    from
            [master data] md
    inner join
            [sample data] cd
            on cd.key = md.key
)x
where
        x.the_test != 'baddie'

【讨论】:

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