我将使用哪种类型的JOIN来使table1
和table2
仅匹配一次。例如,我有table1
(40行)和table2
(10000行)。但是当我在table1
table1.LocationArea = table2.Location
次
What I get: What I wish I could get:
t1.LocationArea,t2.Location t1.LocationArea,t2.Location
--------------------------- ---------------------------
az,az az,az
az,az null,az
ca,ca ca,ca
il,il il,il
tx,tx tx,tx
tx,tx null,tx
az,az null,az
null,il
null,ca
我希望在查询中最终得到10000条记录。
我已尝试inner join
,left
,我正在使用不支持外部联接的ZOHO报告。
SELECT "table1"."LocationArea", "Location"
FROM "table2"
left join "table1" on "Location" = "table1"."LocationArea"
答案 0 :(得分:2)
显然,您有两个连接列的重复值。而不是Cartesian product [INNER] JOIN
会为此产生,而是希望每行只使用一次。您可以通过在每个副本中添加行号(rn
)来实现此目的,并在rn
上另外加入。
除非您有其他限制(例如FK约束),否则每个表可以具有更多或更少的dupe,其价值与其他表相同 - 但您的问题中没有任何内容。要保留所有行,可以使用FULL [OUTER] JOIN
。但是你想在结果中保留10000条记录,这是table2
的基数。因此,它必须是table1
上的LEFT [OUTER] JOIN
(包含40行) - 并排除table1
中可能过多的行。
SELECT t1."LocationArea", t2."Location"
FROM (
SELECT "Location"
, row_number() OVER (PARTITION BY "Location") AS rn
FROM table2
) t2
LEFT JOIN (
SELECT "LocationArea"
, row_number() OVER (PARTITION BY "LocationArea") AS rn
FROM table1
) t1 ON t1."LocationArea" = t2."Location"
AND t1.rn = t2.rn;
适用于Postgres或SQL Server。 MySQL不支持窗口函数,你需要替代:
要明确:LEFT JOIN
只是LEFT OUTER JOIN
的简写,因此您已经在使用外部联接。您的陈述是误解:
我正在使用不支持外部联接的ZOHO报告。
答案 1 :(得分:0)
SELECT * FROM table1 LEFT JOIN table2 ON `table_1_primary_key` = `table_2_primary_key`
或者
SELECT colname FROM table1 LEFT JOIN table2 ON table_1.colname
= table_2.colname
取决于数据库的结构