我在雪花中工作,当我需要在最终结果集中使用独特的列时,我陷入了非常严重的困境。
例如,我有包含以下信息的表 A:
+---------+----------|
| user_id | product |
+---------+----------|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
+---------+----------|
表 B 包含以下信息:
+---------+---------- |
| user_id | Week |
+---------+-----------|
| 1 | 2020-01-02|
| 1 | 2020-01-02|
| 2 | 2020-01-03|
| 2 | 2020-01-03|
| 3 | 2020-01-04|
+---------+-----------|
当我编写查询时
Select * from a join b on a.user_id =b.userid
我获得 user_id 两次,因为我使用的是“*”,但我只需要一次 User_Id,输出为:
+---------+----------|---------- |
| user_id | product | Week |
+---------+----------|-----------|
| 1 | 1 | 2020-01-02|
| 1 | 2 | 2020-01-02|
| 2 | 1 | 2020-01-03|
| 2 | 2 | 2020-01-03|
| 3 | 2 | 2020-01-04|
+---------+----------|-----------|
但我得到了这个:
+---------+----------|---------- |---------+
| user_id | product | Week | user_id |
+---------+----------|-----------|---------+
| 1 | 1 | 2020-01-02| 1 |
| 1 | 2 | 2020-01-02| 1 |
| 2 | 1 | 2020-01-03| 2 |
| 2 | 2 | 2020-01-03| 2 |
| 3 | 2 | 2020-01-04| 3 |
+---------+----------|-----------|---------+
以上只是示例,在实际情况中,我在表 A 中有 355 列,在表 B 中有 410 列,所以我做不到
Select a.column_name_1,a.column_name_2 ....a.column_name_355,b.column_name_1,a.column_name_2 ....a.column_name_355
from table a join table b on a.uder_id = b.userid .
我已经试过了,但它不起作用:
set name = (select listagg(column_name,',') as name from (
select row_number() over(order by column_name) column_id,column_name from information_schema.columns
where table_schema='DEV'
and table_name ='table_a'
and column_name!='WEEK')
);
select $name from
"DEV_DB"."DEV"."table_a" a inner join
"DEV_DB"."DEV"."table_b" b on a.WEEK = b.WEEK
谁能帮帮我!!
答案 0 :(得分:0)
这是你需要的,如果我理解正确
select t.user_id , product , Week
from table1
join ( select user_id , max(week) week
from tableB
group by user_id
) t
on t.user_id = table1.user_id
答案 1 :(得分:0)
使用 JOIN USING
:
USING( <column_list> )
被连接的两个表之间的公共列列表;这些列用作连接列。每个被连接的表中的列必须具有相同的名称和含义。
要正确使用 USING 子句,投影列表(SELECT 关键字后的列和其他表达式的列表)应为“*”。 这允许服务器只返回一次 key_column,这是使用 USING 子句的标准方式。
CREATE TABLE tab1(user_id INT, product_id INT);
CREATE TABLE tab2(user_id INT, week INT);
-- output 4 columns
SELECT * FROM tab1 INNER JOIN tab2 ON tab1.user_id = tab2.user_id;
--USER_ID PRODUCT_ID USER_ID WEEK
-- output 3 columns
SELECT * FROM tab1 INNER JOIN tab2 USING(user_id);
-- USER_ID PRODUCT_ID WEEK
答案 2 :(得分:0)
您可以使用 INFORMATION_SCHEMA 视图来帮助构建您的查询,而不是为那么多列手动编写。
示例:
SELECT '"' || COLUMN_NAME || '" AS ' || '"TableA_' || COLUMN_NAME || '",'
FROM INFORMATION_SCHEMA."COLUMNS"
WHERE TABLE_NAME = 'TableA'
ORDER BY ORDINAL_POSITION
输出类似于:
"col1" as "TableA_col1",
"col2" as "TableA_col2",
etc..
然后只需将列列表包含在 SELECT
和 FROM TableA
中,对 TableB 执行相同操作并添加您的 JOIN
条件。