0

首先,希望标题能表达问题。否则,欢迎任何建议。我的问题是我有以下表结构:

+----+------+------------------+-------------+
| 身份证 | 姓名 | 收件人发件人 | 用户 |
+----+------+------------------+-------------+
| 1 | 一个 | 1 | X |
| 2 | 乙| 2 | 是 |
| 3 | 一个 | 2 | Z |
| 4 | 乙| 1 | 你 |
| | | | |
+----+------+------------------+-------------+

其中,列recipient_sender中的值 1 表示用户是接收者,值 2 表示用户是发送者。
我需要通过以下方式呈现数据:

+----+------+------------+----------+
| 身份证 | 姓名 | 收件人 | 发件人 |
+----+------+------------+----------+
| 1 | 一个 | X | Z |
| 2 | 乙| 你 | 是 |
+----+------+------------+----------+

我试过自我加入,但没有奏效。我不能使用MAXwith CASE WHEN,因为记录的数量太大。

注意:请忽略不良的桌子设计,因为它只是真实桌子的简化示例

4

4 回答 4

1

也许你可以试试这个:

  select min(id) id, 
         name,
         max(decode(recipient_sender, 1, user, '')) sender,
         max(decode(recipient_sender, 2, user, '')) recipient
    from t
group by name

您可以在 SQLFiddle 上查看演示。

于 2013-11-12T12:47:12.013 回答
1

请试试:

SELECT
  MIN(ID) ID
  Name, 
  max(case when recipient_sender=1 then user else null end) sender, 
  max(case when recipient_sender=2 then user else null end) recipient
From yourTable 
group by Name
于 2013-11-12T12:47:45.290 回答
0

创建新表(具有更好的结构):

insert into <newtable> as 
select distinct 
    id, 
    name, 
    user as recipient, 
    (select user from <tablename> where id = recip.id and name = recip.name) as sender
from <tablename> recip

抱歉,这里没有神谕。

于 2013-11-12T12:38:23.517 回答
0

您可以使用此查询选择值

SELECT t.id,
       t.name,
       case
         when t.recipient_sender = 1 then
          t.user
         ELSE
          t2.user
       END as recipient,
       case
         when t.recipient_sender = 2 then
          t.user
         ELSE
          t2.user
       END as sender
  FROM your_table t
  JOIN your_table t2
    ON t.name = t2.name
   AND t.id != t2.id

在此查询之后,您可以添加 DISTINCT 关键字或将它们分组...

此查询用于连接具有 NAME 列的表,但如果您有一些消息标识,请使用该标识连接表,

于 2013-11-12T12:44:27.783 回答