时间:2015-07-29 06:22:39

标签: sql select group-by union

我有两个相似的表和第三个表,其中一个共享列(sms_status_id)包含第一个和第二个表。我想从第一个和第二个表中选择类似的列,将它们与第三个表联合,然后删除重复的行。 这是我到目前为止所做的:

select *
from
(
    select sms_log_id, atm_id, device_id, error_id, datetime, retries, message
    from first_table
    join third_table
    on sms_log_id = sms_status_id
)
union
(
    select sms_id, atm_id, device_id, error_id, datetime, retries, message
    from second_table
    join third_table
    on sms_id = sms_status_id
 )

这给了我想要的但结果有重复的行。我试着用

GROUP BY sms_status_id

但我不知道我应该把它放在哪里,所以没有成功。有什么建议??

这是w

1 个答案:

答案 0 :(得分:0)

您的查询中存在一些错误。

请参阅以下代码,如果这样可以回答您的问题。

@dnoeth是对的,UNION总是返回不同的行,否则使用UNION ALL

MYTABLE1

sms_log_id     | Detail
1                a
1                b
1                c

mytable2

sms_id     | Detail
1            a
2            b
1            d
1            e

mytable3

id     | Status
1        Approve
2        Disapprove

查询:

SELECT t1.sms_log_id as t3_id, t1.Detail, t3.Status
FROM mytable1 as t1
LEFT JOIN mytable3 as t3
  ON t1.sms_log_id = t3.id

UNION

SELECT t2.sms_id as t3_id, t2.Detail, t3.Status
FROM mytable2 as t2
LEFT JOIN mytable3 as t3
  ON t2.sms_id = t3.id

结果:

t3_id   Detail  Status
1       a       Approve
1       b       Approve
1       c       Approve
2       b       Disapprove
1       d       Approve
1       e       Approve

您无法在mytable2的结果a中看到它,因为它已经在mytable1中,并且因为它具有不同的状态而打印b

Demo