【问题标题】:How can I identify all matching columns for two rows of data?如何识别两行数据的所有匹配列?
【发布时间】:2020-12-19 04:26:45
【问题描述】:

使用标准 ANSI SQL,如何返回与 两个特定行数据匹配的列列表?我们不知道列名,只知道表名和 ID(或其他主键)来挑选我们希望比较的两个特定行?

假设我们有一个包含大量房地产列表列的表格。如果我像这样选择两个特定的行:

SELECT * 
FROM listing_data 
WHERE mls_number IN ('111111', '222222')

如何识别恰好在这两个特定行之间匹配的所有其他列的名称?

例如,可能有一个名为“school_district”的列,它们都在同一个学区。或者可能这两个列表共享相同的街道名称,或相同的列表代理,或所有这三个。

【问题讨论】:

  • 我不确定您为什么会关心标准 SQL。一般来说,每个数据库都与标准不同,因此“标准 SQL”可能无需修改即可在没有或很少的数据库上运行。

标签: sql comparison row


【解决方案1】:

要获取列名,您可以从 information_schema.columns 中进行选择,但这只是一个列名表,没有任何数据。如果您尝试执行 select * from tablex where select * from tabley where columnname = 'value' 那么如果它完全有效,除非您的表很小,否则可能需要几个小时才能完成。如果您知道列名来形成查询,这很简单。对您的表格进行一些研究和练习查询,您应该会有所了解。您不太可能在名称列中包含地址数据,因此一旦您熟悉了您的数据,您应该能够制作一个简单的查询。

【讨论】:

  • 非常感谢,但这不是我的问题。我想用一个函数来表征两个特定的数据行,该函数返回列名列表,其中两行共享精确的数据匹配。我希望检查的一些表中有 450 多列(!)和数十万行。我很确定我不必将整个表加入到整个表中,只需对两个特定行做一些事情。
  • 是的,我绝对不明白。您在寻找完全重复的行吗?或者只是任何重复的列。查找在任何其他列中重复的任何数据的列名。所以如果 name 列有一个 George 并且 city 列也有一个 George 那么你想要 city 和 name 的列名吗?
  • 感谢您的关注,对不起,我表达得不好。想象一行包含您的姓名和地址以及州和国家/地区。想象一下第二行对我来说具有相同的数据。我们正在比较我们通过 ID# 检索到的两行。我想返回您和我拥有完全相同数据的每一列的列表。如果我们都住在印第安纳州,那么列表将包含“州”列和“国家”列。如果我们碰巧都住在印第安纳波利斯,那么列表将包含“城市”列,依此类推。
  • 据我所知,这是针对整列对每一列中的每个值进行递归搜索,我认为您想要的是从列开始并在每列中查找重复项,但是如果您有 450 列,这将花费您一些时间来编写每个语句。您可能希望我们使用类似 python 的东西来为您编写它们并使用 information_schema.columns 表来获取您的所有列名。在具有数千行和数百列的数据库中,这将占用计算机一段时间。考虑缩小可能的列列表,
  • 在列中查找重复项的一般方法是 Select columNname from tablenName group by columNname with count > 1, 之后您可以随心所欲地使用它,但我不知道如果您不会从检查每一列是否有重复项开始
【解决方案2】:

您需要明确地对每一列进行比较。一种方法是:

SELECT (CASE WHEN ld1.col1 IS NOT DISTINCT FROM ld.col1 THEN 'col1;' ELSE '' END ||
        CASE WHEN ld1.col2 IS NOT DISTINCT FROM ld.col2 THEN 'col2;' ELSE '' END ||
        . . .
       ) as matches             
FROM listing_data ld1 JOIN
     listing_data ld2
     ON ld1.mls_number = '111111' AND
        ld2.mls_number = '222222'

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2021-09-08
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多