Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I combine 2 select statements into one?

I am a noob when it comes to SQL syntax.

I have a table with lots of rows and columns of course :P Lets say it looks like this:

      AAA BBB CCC DDD ----------------------- Row1 | 1   A   D   X Row2 | 2   B   C   X Row3 | 3   C   D   Z 

Now I want to create an advanced select statement that gives me this combined (pseudo SQLish here):

select 'Test1', * from TABLE Where CCC='D' AND DDD='X' select 'Test2', * from TABLE Where CCC<>'D' AND DDD='X' 

The output would be:

Test1, 1, A, D, X Test2, 2, B, C, X 

How would I combine those two select statements into one nice select statement?

Would it work if I complicated the SQL like below (because my own SQL statement contains an exists statement)? I just want to know how I can combine the selects and then try to apply it to my somewhat more advanced SQL.

select 'Test1', * from TABLE Where CCC='D' AND DDD='X' AND exists(select ...) select 'Test2', * from TABLE Where CCC<>'D' AND DDD='X' AND exists(select ...) 




My REAL SQL statement is this one:

select Status, * from WorkItems t1 where  exists (select 1 from workitems t2 where t1.TextField01=t2.TextField01 AND (BoolField05=1) ) AND TimeStamp=(select max(t2.TimeStamp) from workitems t2 where t2.TextField01=t1.TextField01)  AND TimeStamp>'2009-02-12 18:00:00' 

which gives me a result. But I want to combine it with a copy of this select statement with an added AND on the end and the 'Status' field would be changed with a string like 'DELETED'.

select 'DELETED', * from WorkItems t1 where  exists (select 1 from workitems t2 where t1.TextField01=t2.TextField01 AND (BoolField05=1) ) AND TimeStamp=(select max(t2.TimeStamp) from workitems t2 where t2.TextField01=t1.TextField01)  AND TimeStamp>'2009-02-12 18:00:00' AND NOT (BoolField05=1) 
like image 422
Wolf5 Avatar asked Feb 12 '09 18:02

Wolf5


People also ask

How do I merge two queries in the same table in SQL?

Use the UNION ALL clause to join data from columns in two or more tables. In our example, we join data from the employee and customer tables. On the left of the UNION ALL keyword, put the first SELECT statement to get data from the first table (in our example, the table employee ).


1 Answers

You have two choices here. The first is to have two result sets which will set 'Test1' or 'Test2' based on the condition in the WHERE clause, and then UNION them together:

select      'Test1', *  from      TABLE  Where      CCC='D' AND DDD='X' AND exists(select ...) UNION select      'Test2', *  from      TABLE Where     CCC<>'D' AND DDD='X' AND exists(select ...) 

This might be an issue, because you are going to effectively scan/seek on TABLE twice.

The other solution would be to select from the table once, and set 'Test1' or 'Test2' based on the conditions in TABLE:

select      case          when CCC='D' AND DDD='X' AND exists(select ...) then 'Test1'         when CCC<>'D' AND DDD='X' AND exists(select ...) then 'Test2'     end,     *  from      TABLE  Where      (CCC='D' AND DDD='X' AND exists(select ...)) or     (CCC<>'D' AND DDD='X' AND exists(select ...)) 

The catch here being that you will have to duplicate the filter conditions in the CASE statement and the WHERE statement.

like image 127
casperOne Avatar answered Sep 21 '22 09:09

casperOne