Mysql 代码不接受单独工作正常但联合失败的选择语句



我有以下代码。联接中的选择本身工作得很好,但是当我尝试让它在联接中工作时,我收到一个错误:

您的 SQL 语法有误;请查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的 tup.userid=user_id' 上的"as S") 附近使用的正确语法

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 

我做错了什么?其次,我需要在上面的结构中添加另外两个表。

你不会在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 更有效,如果您知道自己没有或不关心重复项。

不要为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 

我查看了您的查询,发现:

  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;

您的 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 

最新更新