【问题标题】:Trying to perform union when columns dont match当列不匹配时尝试执行联合
【发布时间】:2021-12-24 06:12:25
【问题描述】:

我正在尝试使用 UNION 从临时表和永久表中获取记录。 表 1 - Cust Permanent

cid       marital_status  profession   gender   mobile        current_status      temp_id
 1              1             6            Male      984343435          1                1

表 2 - 客户温度

cid        marital_status        gender   mobile        current_status      perm_id
 1             1                  Male         984343435         1                1

另外,尝试从 master 执行 join 以根据 id 获取 decriction。执行联合查询以从永久表中获取所有记录,我面临的问题是临时表将没有专业,但永久表具有并且联合工作列数应该相同。 我尝试过的查询:

select cid,ma.master.desc, pr_master.desc,gender,mobile,current_status from cust_permament
left join ma_master on ma_master.id = cust_permament.marital_status
left join pr_master on pr_master.id = cust_permament.profession
UNION

select cid,ma.master.desc as marital_status, '' desc,gender,mobile,current_status from cust_temp
left join ma_master on ma_master.id = cust_temp.marital_status

这将返回 2 行,其中一个为空职业,另一个为永久表中的职业。 但是我需要来自 permamnet 表的专业记录

预期结果

cid         desc         desc      gender      mobile          current_status
1            Single      Teacher      Male         984343435          1

实际输出

cid         desc         desc      gender      mobile          current_status
1            Single      Teacher      Male         984343435          1
1            Single                   Male         984343435          1


【问题讨论】:

  • 那么问题到底是什么?
  • 需要单条记录而不是2条
  • UNION 按行合并表格,JOIN 按列合并表格。我无法理解您要达到的目标,您可以将所需的输出作为示例吗?
  • 更新您的问题,添加适当的数据样本和预期结果作为表格文本
  • 在第二个查询中使用NULL as profession

标签: sql sql-server


【解决方案1】:

如果除职业以外的所有行都相同,我认为您想合并为一行。

所以我建议您将除职业以外的所有列分组到您的结果中,如下所示。

我将第二列重命名为专业以防止列名重复,并将**'' desc** 替换为null as profession 以在 min 函数中使用。

您可以使用max 代替min,因为它的目的是删除null。

with t as
(
select ma_master.desc, pr_master.desc as profession, gender, mobile, current_status from cust_permament
left join ma_master on ma_master.id = cust_permament.marital_status
left join pr_master on pr_master.id = cust_permament.profession
UNION

select ma_master.desc, null as profession, gender, mobile, current_status from cust_temp
left join ma_master on ma_master.id = cust_temp.marital_status
)
select desc, min(profession) as profession, gender, mobile, current_status from cust_permament
from   t
group by desc, gender, mobile, current_status

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2018-07-27
    • 2019-06-11
    • 1970-01-01
    • 2017-12-12
    • 2021-04-26
    • 1970-01-01
    • 2018-12-08
    • 2014-07-04
    相关资源
    最近更新 更多