2016-11-08 53 views
1

我想在UNIX下使用paste命令,它需要两个文件并打印第一行,第一个文件,然后是分隔符,然后是第一行,然后是第二个文件,然后换行,然后第二行从第一个文件分隔第二行从第二个文件等mysql“粘贴”两个结果在一起(并排)

所以我想这样的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

+1

你期望的结果单列设置? –

+2

添加样品表数据和预期结果。 – jarlh

+0

可以使用concat和行号变量。你为什么想这样做? –

回答

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:[email protected]+1 `row` , bla from first_40482804 
) `first` 
left join 
(
    select @claRow:[email protected]+1 `row` , cla from second_40482804 
) `second` 
on `first`.`row` = `second`.`row` 

- 结果

paste 
a,80 
z,7 
f,15 
+0

现在做这个没有变数,我卖了! :) – morphles

+0

在MySQL中获取行号,你需要变量。 ...你可以把它包装在一个存储过程中。 –

+0

我将组成一个存储过程示例。 –

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让你期待的结果,我已经猜到了,你有SAM e两个表中的行数,否则这对我没有意义。


编辑:我是有点晚了基思发布或多或少同样的方法

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:[email protected]+1 `row` , bla from first_40482804 
    ) `first` 
    left join 
    (
     select @claRow:[email protected]+1 `row` , cla from second_40482804 
    ) `second` 
    on `first`.`row` = `second`.`row` ; 

END;; 
DELIMITER ; 

call get_paste_stored_procedure() ;