How do I combine 2 select statements into one?

后端 未结 8 2187
执念已碎
执念已碎 2020-12-23 13:23

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 DD         


        
相关标签:
8条回答
  • 2020-12-23 13:53

    If they are from the same table, I think UNION is the command you're looking for.

    (If you'd ever need to select values from columns of different tables, you should look at JOIN instead...)

    0 讨论(0)
  • 2020-12-23 14:01

    I think that's what you're looking for:

    SELECT CASE WHEN BoolField05 = 1 THEN Status ELSE 'DELETED' END AS MyStatus, t1.*
    FROM WorkItems t1
    WHERE (TextField01, TimeStamp) IN(
      SELECT TextField01, MAX(TimeStamp)
      FROM WorkItems t2
      GROUP BY t2.TextField01
      )
    AND TimeStamp > '2009-02-12 18:00:00'
    

    If you're in Oracle or in MS SQL 2005 and above, then you could do:

    SELECT *
    FROM (
      SELECT CASE WHEN BoolField05 = 1 THEN Status ELSE 'DELETED' END AS MyStatus, t1.*,
         ROW_NUMBER() OVER (PARTITION BY TextField01 ORDER BY TimeStamp DESC) AS rn
      FROM WorkItems t1
    ) to
    WHERE rn = 1
    

    , it's more efficient.

    0 讨论(0)
  • 2020-12-23 14:04
    select t1.* from 
    (select * from TABLE Where CCC='D' AND DDD='X') as t1,
    (select * from TABLE Where CCC<>'D' AND DDD='X') as t2
    

    Another way to do this!

    0 讨论(0)
  • 2020-12-23 14:07

    The Union command is what you need. If that doesn't work, you may need to refine what environment you are in.

    0 讨论(0)
  • 2020-12-23 14:09
    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'
    
    UNION
    
    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)
    

    Perhaps that'd do the trick. I can't test it from here though, and I'm not sure what version of SQL you're working against.

    0 讨论(0)
  • 2020-12-23 14:10

    Thanks for the input. Tried the stuff that has been mentioned here and these are the 2 I got to work:

    (
    select 'OK', * 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 (BoolField05=1)
    )
    UNION
    (
    select 'DEL', * 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)
    )
    

    AND

    select 
        case
            when
                (BoolField05=1)
        then 'OK'
        else 'DEL'
            end,
            *
    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 would be the most efficient of these (edit: the second as it only scans the table once), and is it possible to make it even more efficient? (The BoolField=1) is really a variable (dyn sql) that can contain any where statement on the table.

    I am running on MS SQL 2005. Tried Quassnoi examples but did not work as expected.

    0 讨论(0)
提交回复
热议问题