SQL JOIN出现两个表和重复行

时间:2018-05-01 15:10:07

标签: sql

寻找关于为什么我的 JOIN 语句重复行的想法。 我有两张桌子并加入 JOIN LEFT RIGHT 条件。现在发生了一些有趣的事情,即使第二个表中没有添加数据,我的第一个表中的行也会重复。因此,在表1中我有3行,在任何 JOIN 之后它变为9(3 x 3重复),我只有 SELECT 中表1的数据。

到目前为止,我尝试了多项选择,包括 GROUP BY ,但没有运气。你能指导我找到根本原因吗?

2 个答案:

答案 0 :(得分:2)

您没有将每行连接到一行。

Table1         Table2

 a | b | c      x | y | z
---+---+---    ---+---+---
 1 | 2 | 3      1 | 2 | 6
 2 | 2 | 4      2 | 2 | 7
 3 | 2 | 5      3 | 2 | 8

要连接这些表而不重复,您将使用:

SELECT
  *
FROM
  Table1
INNER JOIN
  Table2
    ON  Table1.a = Table2.x
    AND Table1.b = Table2.y

但是,如果我使用以下内容,我会得到9行......

SELECT
  *
FROM
  Table1
INNER JOIN
  Table2
    ON  Table1.a = Table2.x

这是因为Table1中的每一行都会加入Table2中的 所有三个

 a | b | c | x | y | z
---+---+---+---+---+---

 1 | 2 | 3 | 1 | 2 | 6
 1 | 2 | 3 | 2 | 2 | 7
 1 | 2 | 3 | 3 | 2 | 8

 2 | 2 | 4 | 1 | 2 | 6
 2 | 2 | 4 | 2 | 2 | 7
 2 | 2 | 4 | 3 | 2 | 8

 3 | 2 | 5 | 1 | 2 | 6
 3 | 2 | 5 | 2 | 2 | 7
 3 | 2 | 5 | 3 | 2 | 8

如果我在SELECT中包含表2的任何列,那么这不是问题,而是JOIN的问题。

SELECT
  Table1.a,
  Table1.b,
  Table1.c
FROM
  Table1
INNER JOIN
  Table2
    ON  Table1.a = Table2.x

会给......

 a | b | c
---+---+---

 1 | 2 | 3
 1 | 2 | 3
 1 | 2 | 3

 2 | 2 | 4
 2 | 2 | 4
 2 | 2 | 4

 3 | 2 | 5
 3 | 2 | 5
 3 | 2 | 5


类似的情况是在加入数据之前需要聚合数据。

Table1            Table2

 Month | Val      Month | Day | Sales
-------+-----    -------+-----+-------
   1   | 'X'        1   |  1  |   6
   2   | 'Y'        1   |  2  |   7
   3   | 'Z'        1   |  3  |   6

                    2   |  1  |   4
                    2   |  2  |   5
                    2   |  3  |   6

                    3   |  1  |   7
                    3   |  2  |   5
                    3   |  3  |   3

要连接这些表而不重复,Table2需要聚合到与Table1相同的粒度。

SELECT
  *
FROM
  Table1
INNER JOIN
(
  SELECT
    Month,
    SUM(sales)   AS sales
  FROM
    Table2
  GROUP BY
    month
)
  AS Table2Monthly
    ON Table2Monthly.month = Table1.month

答案 1 :(得分:0)

由于没有太多信息可供使用,我的猜测是你要从表一中选择一个结果。对于每一行,您将得到三行的结果,这使得它们总共有九行。

保持简单

SELECT * from tb1 
LEFT JOIN tb2
 ON tb2_key = tb1._nui 

应该给你3行。

SELECT * from tb1
JOIN tb2
 ON tb2_key = tb1._nui 

如果tb2为空,应该给你0行。