2014-09-27 68 views
-1

我想选择一些数据,但是我遇到了问题,因为这是一个子查询,并且子查询中的数据使用别名进行连接。我想设置这是因为我将以不同的方式在子查询上运行聚合。这是一个例子。我希望你明白我在这里要做的。这不是我正在使用的实际数据,因此我想使用下面的方法。问题是我试图查询一个具有别名,并有一个别名的联接的子查询。请记住,下面的工作如果我只选择main_query.FullState,如果我有1个连接,但由于我加入两次,我需要添加一个别名。这是我遇到麻烦的地方。加入别名的子查询

 
USERTABLE 
---------------- 

    Name BirthState  LivingState 
    David CA    CA 
    Roger NY    PA 
 
STATESTABLE 
---------------- 
    State FullState 

    CA  California 
    NY  New York 
    PA  Philadelphia 
select main_query.LivingTable.FullState, count(*) from (
    select * from USERTABLE 
    join STATESTABLE LivingTable on USERTABLE.LivingState = STATESTABLE.State 
    join STATESTABLE BirthTable on USERTABLE.BirthState = STATESTABLE.State 
)main_query 
+0

您的问题是,你正在使用'选择*'。切勿使用'select *'。始终只选择需要的列和别名。 – 2014-09-28 13:02:22

+0

@ Nick.McDermaid你是完全正确的。我最终选择了列(40+以上),并解决了我的问题。 – KingKongFrog 2014-09-28 15:41:17

回答

0

你可以使用连接表的别名。你甚至不能访问“内部”表别名,因为它超出了范围。

如果您想要检索原始表中具有相同列名的两列,请在AS中使用列别名。

另一件事:请对这些案件使用WITH。这极大地提高了可读性。

WITH main_query AS 
(
    select lt.FullState AS LivingFullState, bt.FullState AS BirthFullState 
    from USERTABLE ut 
    join STATESTABLE lt on lt.LivingState = ut.State 
    join STATESTABLE bt on bt.BirthState = ut.State 
) 
select LivingFullState, count(*) from main_query 
0

您应该能够在不诉诸“子查询”的情况下运行“聚合”和其他类型的查询。简单地使用像

Select living.FullState as "Living State", count(1) 
    from USERTABLE user JOIN STATESTABLE living on living.LivingState = user.State 

类似下面的项目也可能是有用的

Select State, Sum(LivingStatePopulation) as "Living State Population", Sum(BirthStatePopulation) as "Birth State Population" 
    from (Select living.FullState as "State", count(1) as "LivingStatePopulation", 0 as "BirthStatePopulation" 
      from USERTABLE user JOIN STATESTABLE living on living.LivingState = user.State 
     UNION 
     Select birth.FullState as "State", 0 as "LivingStatePopulation", count(1) as "BirstStatePopulation" 
) 
order by State