使用什么类型的JOIN

时间:2015-01-19 22:47:38

标签: mysql sql-server postgresql join zoho

我将使用哪种类型的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 joinleft,我正在使用不支持外部联接的ZOHO报告。

SELECT "table1"."LocationArea", "Location" 
FROM "table2"
left join "table1" on  "Location" = "table1"."LocationArea"

2 个答案:

答案 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

取决于数据库的结构