一个表上具有不同列的 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 连接的主要内容,如果未能解决你的问题,请参考以下文章