一个表上具有不同列的 SQL 连接

Posted

技术标签:

【中文标题】一个表上具有不同列的 SQL 连接【英文标题】:SQL join with distinct column on one table 【发布时间】:2016-01-29 22:59:01 【问题描述】:

也许我使用了错误的词进行搜索,因为我在其他地方找不到答案,但我需要连接两个表,但要确保其中一个表的 ID 是不同的。类似于以下内容:

SELECT B.COLUMN_A, B.COLUMN_B, B.COLUMN_C
FROM TABLE1 A
JOIN TABLE2 B
ON (Distinct) A.COLUMN_A = B.COLUMN_A;

来自TABLE1 的值A.COLUMN_A 需要是DISTINCT

我尝试了以下方法,但没有成功:

SELECT B.COLUMN_A, B.COLUMN_B, B.COLUMN_C
FROM TABLE1 A
JOIN (SELECT DISTINCT COLUMN_A FROM TABLE2) B
ON A.COLUMN_A = B.COLUMN_A;

我不断收到 ORA-00904:B.COLUMN_C 上的无效标识符错误。如果我尝试使用) AS B,则会收到 ORA-00905: missing keyword 错误。

【问题讨论】:

它正在使用别名 B。不知道为什么... 这个例子可能有用***.com/a/2639114/5609420 @AlexS 这个答案看起来和我已经试过的一样。 "B.COLUMN_C 上的标识符无效错误" - 当然它确实抱怨这一点。您只在派生表中选择 column_a。因此没有b.column_c,只有b.column_a。请添加一些示例数据和基于该数据的预期输出(请格式化文本,不要屏幕截图) @a_horse_with_no_name 是的,我自己也注意到了这一点。但是如果我(SELECT DISTINCT COLUMN_A, COLUMN_B, COLUMN_C FROM TABLE2) 就违背了DISTINCT 的目的。我只希望它基于COLUMN_A 与众不同。 【参考方案1】:

使用ROW_NUMBER 获取每个COLUMN_A 的单行:

SELECT *
FROM table1 A
JOIN
 (
   SELECT *,
      ROW_NUMBER() OVER (PARTITION BY COLUMN_A ORDER BY COLUMN_A) AS rn
   FROM table2
 ) B
ON A.column_a = B.column_a
AND B.rn = 1

【讨论】:

【参考方案2】:

如果您不关心其他值,请使用group by

SELECT b.column_a, b.column_b, b.column_c
FROM table1 a
  JOIN (
    SELECT column_a, max(column_b) as column_b, max(column_c) as column_c
    FROM table2
    GROUP BY column_a
  ) b ON a.column_a = b.column_a

【讨论】:

【参考方案3】:

也许你需要这样的东西:

 select * from 
(
    select column_a,column_b,column_c
    from 
        (
            select  column_a,column_b,column_c, count(1) over (partition by column_a) as num
            from tableB
        )
    where num = 1
)tB
inner join tableA
using (column_a)

双重嵌套不是必须的,但我希望它使查询更具可读性

【讨论】:

【参考方案4】:

如果您需要 col_a、col_b、col_c 并希望确保 col_a 永远不会重复并且 col_b、col_c 值不相关,那么:

SELECT col_a, col_b, col_c 
FROM table2 
WHERE rowid in ( SELECT min(rowid) 
                 FROM table2 A , table1 B )
                 WHERE B.col_a = A.col_a 
                 GROUP BY A.col_a )

在上面,您选择了 Table2 的一个不同行,该行也存在于 Table1 中。然后使用该行的 id 选择所有三列。

【讨论】:

【参考方案5】:

您没有从TABLE1 中选择任何列,因此您对(不同的)TABLE1 记录的联接实际上只是一个半联接,最容易表达为:

SELECT B.COLUMN_A, B.COLUMN_B, B.COLUMN_C
FROM TABLE2 B
WHERE EXISTS ( SELECT 'at least one row in table1' 
               FROM   TABLE1 A
               WHERE  A.COLUMN_A = B.COLUMN_A );

【讨论】:

以上是关于一个表上具有不同列的 SQL 连接的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句连接

用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ

SQL - 连接表上的查询

Oracle 按顺序连接行,其中每个表上的顺序定义不同

具有集群和分区的表上的 Bigquery SQL 性能问题

连接具有相同值的行的列值(不同列的)