简体   繁体   中英

How to union two tables with different no of columns?

This is my query.

select id,sender_id,receiver_id,date_added,subject,book_id,message from trading_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66)
union
select id,sender_id,receiver_id,date_added,message,'A' as subject,'B' as book_id from personal_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) order by date_added asc

And I m getting such error. Unknown column 'A' in 'where clause'

Please help.

This should work for MYSQL .

One of important rules in union: field counts must be equal.

select id,sender_id,receiver_id,date_added,message, subject,book_id, from trading_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66)
union
select id,sender_id,receiver_id,date_added,message,'','' from personal_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) order by date_added asc

NOTE: You don't need for aliases in your second subquery, engine takes fieldnames from your first select result

I ran this for MS Sql Server. I think one of the problems is that 'B' is being returned as book_id, which I'm guessing is an int in the first part of the union query. As "TheOneWhoPrograms" mentioned columns have to be in order as well.

Create Table dbo.trading_message
(
 id int
 ,sender_id int
 ,receiver_id int
 ,date_added datetime
 ,subject varchar(100)
 ,book_id int
 ,message varchar(1000)
)

Create Table dbo.personal_message
(
 id int
 ,sender_id int
 ,receiver_id int
 ,date_added datetime
 ,message varchar(1000)
)

select 
 id
 ,sender_id
 ,receiver_id
 ,date_added
 ,subject
 ,book_id -- <- I *guessing* this is an int
 ,message 
from trading_message 
where (receiver_id=1132 or receiver_id=66) 
 and (sender_id=1132 or sender_id=66)

union

select 
 id
 ,sender_id
 ,receiver_id
 ,date_added
 ,'A' as subject
 ,0 as book_id -- <- Changed this from 'B' to zero
 ,message
from personal_message 
where (receiver_id=1132 or receiver_id=66) 
 and (sender_id=1132 or sender_id=66) 

order by date_added asc

Above has both column(or more specifically) column data types in the same order

select id,sender_id,receiver_id,date_added,subject,book_id,message from trading_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66)
union
select id,sender_id,receiver_id,date_added,'A', 'B', null from personal_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) order by date_added asc

Give that a try.. I think I matched up your columns in the right order each having the right amount...

try please set mysql variable instead of char 'A' like

@var1 AS subject

instead of

'A' as subject

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM