使用标准ANSI SQL,如何返回与两行特定数据匹配的列列表?我们不知道列的名称,只知道表名和ID(或其他主键(来挑选我们想要比较的两个特定行?
假设我们有一个表,其中有大量的列用于房地产列表。如果我这样选择两个特定的行:
SELECT *
FROM listing_data
WHERE mls_number IN ('111111', '222222')
如何识别这两个特定行之间恰好匹配的所有其他列的名称?
例如,也许有一个名为"school_district"的专栏,它们都在同一个地区。或者,这两个房源共享相同的街道名称,或者相同的房源代理,或者这三个都有。
要获取列名,可以从information_schema.columns中进行选择,但这只是一个列名表,没有任何数据。如果您试图从tablex中选择*,其中从tabley中选择*(其中columnname='value'(,那么如果它能工作,除非您的表很小,否则可能需要数小时才能完成。如果您知道自己的列名,那么组成查询就很简单。在你的表上做一些研究和练习查询,你应该会得到一些见解。您不太可能在名称列中包含地址数据,因此一旦熟悉了数据,就应该能够创建一个简单的查询。
您需要显式地对每一列进行比较。一种方法是:
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'