0

我正在尝试将同一个表中的 3 个电子邮件列连接到 1 个大电子邮件列中,我可以使用以下 SQL 来完成:

SELECT email
FROM (
SELECT email
FROM accounts
UNION 
SELECT email2
FROM accounts
UNION 
SELECT email3
FROM accounts
)accounts  WHERE email LIKE '%@%'

但我也希望能够仅将同一表(帐户组)中的不同列 = 的行返回到特定值。例如,我认为可行的方法:

SELECT email, accountgroup
FROM (

SELECT email, accountgroup
FROM accounts
UNION 
SELECT email2, accountgroup
FROM accounts
UNION 
SELECT email3, accountgroup
FROM accounts
)accounts
WHERE email LIKE  '%@%'
AND accountgroup = 'Vyrav'

第二条语句没有按预期工作,只返回 1 行。我认为 UNION 正在合并 accountgroup 列值相同的行(这将是所有行)。

如果我修改第一条语句以使最后一行像这样:

)accounts  WHERE email LIKE '%@%' AND accountgroup='Vyrav'

它说在“where子句”中有一个“未知列”accountgroup

任何人都可以建议我在这里做错了什么,或者我应该做什么?

在此先感谢,非常感谢任何帮助。

4

2 回答 2

1

正如您所怀疑的,UNION将统一相同的结果。相反,您应该使用UNION ALL来保留所有原始行,即使它们相同。

于 2013-11-08T11:39:23.883 回答
0

试试这个:在这里工作小提琴

SELECT
      EMAIL,
      ACCOUNTGROUP
FROM
      (SELECT
            EMAIL AS EMAIL,
            ACCOUNTGROUP
       FROM
            ACCOUNTS
       UNION ALL
       SELECT
            EMAIL2 AS EMAIL,
            ACCOUNTGROUP
       FROM
            ACCOUNTS
       UNION ALL
       SELECT
            EMAIL3 AS EMAIL,
            ACCOUNTGROUP
       FROM
            ACCOUNTS) ACCOUNT
WHERE
      EMAIL LIKE '%@%'
      AND ACCOUNTGROUP = 'Vyrav';

结果:

EMAIL                     ACCOUNTGROUP             
------------------------- -------------------------
a@a.com                   Vyrav                    
b@b.com                   Vyrav                    
c@c.com                   Vyrav                    

3 rows selected.
于 2013-11-08T11:40:43.320 回答