代码之家  ›  专栏  ›  技术社区  ›  Azhar

用于分别从三个表中选择记录的SQL查询

  •  -1
  • Azhar  · 技术社区  · 15 年前

    从三个表中选择记录且这些表之间没有关系的SQL查询。实际上,我想让它成为一个视图。

    假设有三个故事 Table1, Table2, Table3

    我想先用一些筛选条件显示表1的记录 然后是表2的记录 在表3的最后一个部分,当我们执行视图时,它像表一样显示记录。

    可以有任意数量的行,但记录必须在此序列中。

    7 回复  |  直到 15 年前
        1
  •  3
  •   HLGEM    15 年前

    如果您需要每个表中的所有记录,我建议使用union all而不是union。联合将使用Distinct筛选出重复项。如果您不需要它,它只是减慢了查询的速度。

    这里有进一步的解释: http://wiki.lessthandot.com/index.php/Union_All

    要演示如何在每个表中没有所有列时进行处理,请执行以下操作:

    select 
       1 as seq,col1, col2, col3, cast(null as varchar (40)) as col4 
       FROM Table1 
       where ... 
    UNION ALL 
    select 
       2 as seq,'Unknown', col2, null, col4 
       FROM Table2 
       where ... 
    UNION ALL 
    select 
       3 as seq ,col1, col2, col3, cast(null as varchar (40)) as col4  
       FROM Table3 
       where ... 
    ORDER BY seq
    
        2
  •  2
  •   KM.    15 年前

    尝试:

    select
       1,col1, col2, col3
       FROM Table1
       where ...
    UNION ALL
    select
       2,col1, col2, col3
       FROM Table2
       where ...
    UNION ALL
    select
       3,col1, col2, col3
       FROM Table3
       where ...
    ORDER BY 1
    

    请注意,这三个查询中的每一个都需要具有相同的列数,并且数据类型也应该是一致的。此外,我还使用union all来加快查询速度,因为在这三个查询之间消除重复是没有用的,因为序列表将保证没有重复。

    要在结果集中没有序列列,请尝试:

    SELECT
        col1,col2,col3 
        FROM (select
                 1 as seq,col1, col2, col3
                 FROM Table1
                 where ...
              UNION ALL
              select
                 2 as seq,col1, col2, col3
                 FROM Table2
                 where ...
              UNION ALL
              select
                 3 as seq,col1, col2, col3
                 FROM Table3
                 where ...
             ) dt
        ORDER BY seq
    
        3
  •  1
  •   Leslie    15 年前

    可以使用联合查询:

    SELECT Field1, Field2, Field3, '1' as Sequence FROM Table1 WHERE SomeCriteria
    UNION
    SELECT Field7, Field5, Field6, '2' FROM Table2 WHERE SomeCriteria
    UNION
    SELECT Field4, Field8, Field9, '3' FROM Table3 WHERE SomeCriteria
    
        4
  •  1
  •   MJB    15 年前

    怎么样:

    create view AZ_VIEW as
    select 1 as orderby, tbl1Col1 as col1, tbl1Col2 as col2, tbl1col3 as col3 from Table1 where criteria1='val'
    union 
    select 2, tbl2Col1, tbl2Col2, tbl2col3 from Table2 where criteria2='anotherval'
    union 
    select 3, tbl3Col1, tbl3Col2, tbl3col3 from Table3 where criteria3='athirdval'
    ;
    
        5
  •  1
  •   Peter Lang    15 年前

    如果表共享相同的列,则可以使用 Union All :

    Select col1, col2, 1 As seq
    From table1
    Union All
    Select col1, col2, 2 As seq
    From table1
    Union All
    Select col1, col2, 3 As seq
    From table1
    Order By seq
    
        6
  •  1
  •   LesterDove    15 年前

    您可以合并这三个表,注意确保它们都返回相同数量的字段。控制订单有一个简单的欺骗(见下文):

    从中选择* ( 从表1中选择a、b、c、1作为列表顺序 联合 从表2中选择a、b、c、2作为列表顺序 联合 从表3中选择a、b、c、3作为列表顺序 ) 按列表排序

        7
  •  0
  •   D'Arcy Rittich    15 年前

    你可以这样做- WHERE ID = 34 只是一个样本过滤器:

    create view vAllRecords as
    select 1 as Rank, Field1, Field2 from Table1 where ID  = 34
    UNION
    select 2 as Rank, Field1, Field2 from Table2
    UNION
    select 3 as Rank, Field1, Field2 from Table3
    

    使用 UNION 将删除所有重复项。如果您知道不会有重复项,或者希望看到它们,查询将使用 UNION ALL 相反。

    ORDER BY 在视图中不允许,因此从视图中选择时需要按等级排序:

    select *
    from vAllRecords 
    order by Rank