一个查询,从不同的表中获取多个不相关的列

rseugnpd  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(343)

假设我有3个表:表1、表2和表3。我基本上希望将以下3个查询组合在一起: SELECT columnA FROM table1 SELECT columnB FROM table2 SELECT columnC FROM table3 列的大小可能不同,我希望避免重复数据。如果columna有3个元素,columnb有1个元素,columnc有2个元素,我会得到一个表,其中每列都有各自的元素数。未填充的行可以保留为空。
如何创建完成此任务的单个查询?
简单的查询 SELECT DISTINCT table1.columnA, table2.columnB, table3.columnC FROM table1, table2, table3 只是给了我一个表,其中列出了这些列中所有元素的可能组合。

xnifntxz

xnifntxz1#

你可以试着用union

SELECT columnA FROM table1
    union
    SELECT columnB FROM table2
    union 
    SELECT columnC FROM table3
blpfk2vs

blpfk2vs2#

如果只需要不同的值,可以使用union

SELECT columnA , 'T1' t_name
FROM table1
UNION
SELECT columnB, 'T2'  
FROM table2
UNION
SELECT columnC , 'T3' 
FROM table3

但是如果你需要所有的值,你应该使用union all

SELECT columnA, 'T1' t_name
FROM table1
UNION ALL
SELECT columnB, 'T2' 
FROM table2
UNION ALL
SELECT columnC , 'T3' 
FROM table3
hgb9j2n6

hgb9j2n63#

UNION ALL 或者 UNION 帮你。取决于是否需要复制:

SELECT columnA FROM table1
UNION ALL
SELECT columnB FROM table2
UNION ALL
SELECT columnC FROM table3

欲了解更多信息,请阅读:https://dev.mysql.com/doc/refman/8.0/en/union.html
编辑:
您可以使用第二列和固定文本来区分应用程序中的记录:

SELECT columnA,'TABLE1' FROM table1
UNION ALL
SELECT columnB,'TABLE2' FROM table2
UNION ALL
SELECT columnC,'TABLE3' FROM table3
2w3kk1z5

2w3kk1z54#

如果您采用并集的思想并添加一个行号,那么您可以创建一个行号列表,然后使用该列表左键联接到三个表。例如

drop table if exists t1,t2,t3;
create table t1(id int);
create table t2(id int);
create table t3(id int);

insert into t1 values(1),(3);
insert into t2 values(10),(20),(40);
insert into t3 values(3);

select s.rownumber,t1.id t1id
        ,t2.id t2id
        ,t3.id t3id
from
(
select @r1:=@r1+1 rownumber from t1 cross join(select @r1:=0) r1
union 
select @r2:=@r2+1 rownumber from t2 cross join(select @r2:=0) r2
union 
select @r2:=@r3+1 rownumber from t3 cross join(select @r3:=0) r3
) s
left join (
select id,@r4:=@r4+1 rownumber from t1 cross join(select @r4:=0) r4
) t1 on t1.rownumber = s.rownumber
left join (
select id,@r5:=@r5+1 rownumber from t2 cross join(select @r5:=0) r5
) t2 on t2.rownumber = s.rownumber
left join (
select id,@r6:=@r6+1 rownumber from t3 cross join(select @r6:=0) r6
) t3 on t3.rownumber = s.rownumber
;

+-----------+------+------+------+
| rownumber | t1id | t2id | t3id |
+-----------+------+------+------+
|         1 |    1 |   10 |    3 |
|         2 |    3 |   20 | NULL |
|         3 | NULL |   40 | NULL |
+-----------+------+------+------+
3 rows in set (0.00 sec)

相关问题