我想在unix中使用paste
命令,它需要两个文件并打印第一行,第一个文件,然后是分隔符,然后是第二个文件的第一行,然后是换行符,然后是第一个文件分隔符的第二行第二行来自第二档等的行
所以我想在sql中使用这样的东西,从两个表中获取列,输出结果,从第一个和第二个表开始的第一行(作为一行)的列,然后从两个表中获取第二行等。没有像第一个那样的交叉连接从第一个表行,第二个表从第二个表等。这甚至可能吗?很难在网上搜索这个......
编辑:
Table 1: Table 2:
column bla column cla
a 80
z 7
f 15
k
Expected result:
column bla, column cla
a, 80
z, 7
f, 15
k, NULL
很简单:),除了根本没有......
EDIT2: 请不要@variables
答案 0 :(得分:1)
create table if not exists first_40482804 (
bla varchar(50)
) ;
create table if not exists second_40482804 (
cla int
) ;
truncate table first_40482804 ;
truncate table second_40482804 ;
insert into first_40482804 ( bla ) values ('a') ;
insert into first_40482804 ( bla ) values ('z') ;
insert into first_40482804 ( bla ) values ('f') ;
insert into second_40482804 ( cla ) values ( 80 ) ;
insert into second_40482804 ( cla ) values ( 7 ) ;
insert into second_40482804 ( cla ) values ( 15 ) ;
set @blaRow = 0 ;
set @claRow = 0 ;
select concat( `first`.bla,',',`second`.cla) paste from
(
select @blaRow:=@blaRow+1 `row` , bla from first_40482804
) `first`
left join
(
select @claRow:=@claRow+1 `row` , cla from second_40482804
) `second`
on `first`.`row` = `second`.`row`
- 结果
paste
a,80
z,7
f,15
答案 1 :(得分:1)
MYSQL中没有ROWNUMBER设施,但您可以像这样模仿它:
SELECT t.*,
@rownum := @rownum + 1 AS rank
FROM YOUR_TABLE t,
(SELECT @rownum := 0) r
所以你可以让2个查询返回每个表的行号:
SELECT bla, @rownum := @rownum + 1 AS rank
FROM table_1 , (SELECT @rownum := 0) r1
SELECT bla, @rownum := @rownum + 1 AS rank
FROM table_2 , (SELECT @rownum := 0) r2
并将它们连接在行号
上SELECT
CONCAT( T1.bla,',',T2.cla)
FROM
( SELECT bla, @rownum := @rownum + 1 AS rank
FROM table_1 , (SELECT @rownum := 0) r1
) T1
INNER JOIN
( SELECT cla, @rownum := @rownum + 1 AS rank
FROM table_2 , (SELECT @rownum := 0) r2
) T2
ON T1.rank = T2.rank
当然,使用INNER join
来获得您期望的结果,我猜想两个表中的行数相同,否则这对我没有意义。
编辑:由于基思发布了或多或少相同的方法,我有点迟了
答案 2 :(得分:1)
create table if not exists first_40482804 (
bla varchar(50)
) ;
create table if not exists second_40482804 (
cla int
) ;
truncate table first_40482804 ;
truncate table second_40482804 ;
insert into first_40482804 ( bla ) values ('a') ;
insert into first_40482804 ( bla ) values ('z') ;
insert into first_40482804 ( bla ) values ('f') ;
insert into second_40482804 ( cla ) values ( 80 ) ;
insert into second_40482804 ( cla ) values ( 7 ) ;
insert into second_40482804 ( cla ) values ( 15 ) ;
DELIMITER ;;
DROP PROCEDURE IF EXISTS get_paste_stored_procedure ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE get_paste_stored_procedure()
BEGIN
set @blaRow = 0 ;
set @claRow = 0 ;
select concat( `first`.bla,',',`second`.cla) paste from
(
select @blaRow:=@blaRow+1 `row` , bla from first_40482804
) `first`
left join
(
select @claRow:=@claRow+1 `row` , cla from second_40482804
) `second`
on `first`.`row` = `second`.`row` ;
END;;
DELIMITER ;
call get_paste_stored_procedure() ;