2014-01-13 33 views
0

我有以下代码。加入内部的选择可以很好地工作,但是当我试图让它在加入中工作时,出现错误:Mysql代码不接受select语句,单独工作但单独工作失败

您的SQL语法错误;检查位于第1行

Select tup.*, tu.email, S.user_id, S.name, S.value 
From tb_user_profile tup 
join tb_user tu on tup.userid=tu.id 
Join((Select tba.id, tba.accountName, tba.currentBalance 
     from tb_bank_account tba)as T 
     union 
     Select tpi.user_id, tpi.name, tpi.value  
     from tb_property_item tpi)as S) on tup.userid=user_id 

什么我做错了对应于你的MySQL服务器版本“上tup.userid = USER_ID为S)”正确的语法使用附近的手册?其次,我需要在上面的结构中添加两个其他表。

回答

1

的选择你不别名子查询中union;你把别名放在最后。试试这个:

Select tup.*, tu.email, S.user_id, S.name, S.value 
From tb_user_profile tup join 
    tb_user tu 
    on tup.userid = tu.id Join 
    ((Select tba.id, tba.accountName, tba.currentBalance 
     from tb_bank_account tba 
    ) union 
     (Select tpi.user_id, tpi.name, tpi.value  
     from tb_property_item tpi 
    ) 
    ) s 
    on tup.userid = s.user_id ; 

顺便说一句,union allunion更有效,如果你知道你没有或者不关心重复。

-1

您的UNION语句必须具有相同的确切列数,并且这些列类型的顺序必须相同。这些列可能是不同的来源,只要确保计数和类型的顺序相同即可。返回的列名和类型由第一个SELECT确定。

您正在选择*,并在第一次选择时再加上5列。你的第二选择只有2列。

编辑:您的代码清理更改我的答案: 您的子查询表不是别名,SQL不知道如何引用它。 ON也不明确。哪个用户名?尝试改变这样:

Select tup.*, tu.email, S.user_id, S.name, S.value 
From tb_user_profile tup 
join tb_user tu on tup.userid=tu.id 
Join (Select tba.id, tba.accountName, tba.currentBalance 
     from tb_bank_account tba 
     union 
     Select tpi.user_id, tpi.name, tpi.value  
     from tb_property_item tpi) S on tup.userid=S.id 
+1

联合的列数是相同的。它的第一部分是3列:'tba.id,tba.accountName,tba.currentBalance'和第二列中的3列:'tpi.user_id,tpi.name,tpi.value' –

+0

如果我使用Select低于代码的作品。如果我在加入之后删除选择权,那么代码就可以工作。但是,我将他们不喜欢的两个人和代码错误结合起来。这两个选择该错误具有相同的输出结构。 – user3175381

0

不要别名的union

Select tup.*, tu.email, X.user_id, X.name, X.value 
From tb_user_profile tup 
join tb_user tu on tup.userid=tu.id 
Join 
(
    Select tba.id, tba.accountName, tba.currentBalance 
    from tb_bank_account tba 
    union 
    Select tpi.user_id, tpi.name, tpi.value  
    from tb_property_item tpi 
) X on tup.userid = Xuser_id 
0

我检查了您的查询,我发现这一点:在你的括号

  1. 错误:你开一些,却忘了关闭它们
  2. 你宣布一个别名两次
  3. 你忘了写行源在你最后的on条款中。

我建议您以易于查看的方式编写查询。这里是更正:

select 
    tup.*, tu.email, S.user_id, S.name, S.value 
from 
    tb_user_profile tup 
    join tb_user tu on tup.userid=tu.id 
    join (
     select 
      tba.id, tba.accountName, tba.currentBalance 
     from 
      tb_bank_account as tba 
     union select 
      tpi.user_id, tpi.name, tpi.value  
     from 
      tb_property_item as tpi 
    ) as S on tup.userid=s.user_id; 
相关问题