-1

我将使用什么类型的 JOIN 来获取table1table2匹配一次。例如,我有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"
4

2 回答 2

2

显然,两个连接列都有重复的值。您希望每行只使用一次,而不是为此产生的笛卡尔。您可以通过为每个副本添加一个行号 ( ) 并另外加入来实现此目的。[INNER] JOINrnrn

除非您有其他限制(例如 FK 约束),否则每个表对于相同值的重复值可能比另一个表更多或更少 - 但您的问题没有任何内容。要保留所有行,可以使用FULL [OUTER] JOIN. 但是您想在结果中保留 10000 条记录,这是 的基数table2。所以它必须是一个LEFT [OUTER] JOINon table1(有 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 报告。

于 2015-01-19T23:57:18.533 回答
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

取决于数据库的结构

于 2015-01-19T22:58:42.817 回答