使用什么类型的 JOIN
What type of JOIN to use
我将使用什么类型的 JOIN 来使 table1
和 table2
仅匹配一次。例如,我有 table1
(40 行)和 table2
(10000 行)。但是当我在 table1.LocationArea = table2.Location
上使用连接时,我会一遍又一遍地重复 table1
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"
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
取决于你的数据库结构
显然,两个连接列都有重复的值。您希望每一行仅使用 一次 ,而不是 Cartesian product 一个 [INNER] JOIN
。您可以通过为每个副本添加一个行号 (rn
) 并另外加入 rn
来实现此目的。
每个 table 可以有比另一个更多或更少的相同值的重复,除非你有额外的限制(如 FK 约束) - 但你的问题没有任何内容。要保留 all 行,可以在 table1
(有 40 行)上使用 FULL [OUTER] JOIN
. But you want to keep 10000 records in the result, which is the cardinality of table2
. So it must be a LEFT [OUTER] JOIN
- 并从 table1
.[=25 中排除可能过多的行=]
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 服务器。 MySQL 不支持 window 功能,您需要一个替代品:
- SQL SELECT last entry without limiting
明确一点:LEFT JOIN
只是 shorthand 对应 LEFT OUTER JOIN
,因此您已经在使用外部联接。你的说法是误解:
I am using ZOHO reports which does not support outer join's.
我将使用什么类型的 JOIN 来使 table1
和 table2
仅匹配一次。例如,我有 table1
(40 行)和 table2
(10000 行)。但是当我在 table1.LocationArea = table2.Location
table1
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"
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
取决于你的数据库结构
显然,两个连接列都有重复的值。您希望每一行仅使用 一次 ,而不是 Cartesian product 一个 [INNER] JOIN
。您可以通过为每个副本添加一个行号 (rn
) 并另外加入 rn
来实现此目的。
每个 table 可以有比另一个更多或更少的相同值的重复,除非你有额外的限制(如 FK 约束) - 但你的问题没有任何内容。要保留 all 行,可以在 table1
(有 40 行)上使用 FULL [OUTER] JOIN
. But you want to keep 10000 records in the result, which is the cardinality of table2
. So it must be a LEFT [OUTER] JOIN
- 并从 table1
.[=25 中排除可能过多的行=]
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 服务器。 MySQL 不支持 window 功能,您需要一个替代品:
- SQL SELECT last entry without limiting
明确一点:LEFT JOIN
只是 shorthand 对应 LEFT OUTER JOIN
,因此您已经在使用外部联接。你的说法是误解:
I am using ZOHO reports which does not support outer join's.