0

我有一张桌子,例如:

id 名称 ref_id 订单 data_obj
-- ---- ------ ----- --------
1 Sam 0 15 [二进制数据]
2 Jack 0 20 [二进制数据]
3 苏 0 25 [二进制数据]
4 Sam2 1 - [无数据]
5 Sue2 3 - [无数据]
6 Sam3 1 - [无数据]

这个想法是,除了 data_obj 之外,我还有更多常见的列,所以我不想再次插入它们,只想将引用 id 插入到相同的数据中。

是否可以编写查询并选择此:

1 - Sam - 来自 id 1 的二进制数据
4 - Sam2 - 来自 id 1 的二进制数据
6 - Sam3 - 来自 id 1 的二进制数据
2 - Jack - 来自 id 2 的二进制数据
3 - Sue - 来自 id 3 的二进制数据
5 - Sue2 - 来自 id 3 的二进制数据

请注意,我是根据名为 order 的列进行排序的,并且对于引用的行,该列没有实际数据。

4

3 回答 3

2
SELECT t1.id, t1.name, t2.data_obj 
FROM your_table t1
LEFT JOIN your_table t2 ON t1.ref_id = t2.id
ORDER BY t1.order

其他版本,不返回没有 ref 的行

SELECT t1.id, t1.name, t2.data_obj 
FROM your_table t1, your_table t2
WHERE t1.ref_id = t2.id
ORDER BY t1.order
于 2009-03-05T16:27:43.990 回答
0

这是对@vartec答案的修改。此修改用于COALESCE()组合data_obj来自主行或引用的行。

SELECT t1.id, t1.name, COALESCE(t1.data_obj, t2.data_obj) 
FROM your_table t1
LEFT JOIN your_table t2 ON t1.ref_id = t2.id
ORDER BY COALESCE(t1.order, t2.order), ref_id;

COALESCE()是返回其第一个非 NULL 参数的标准 SQL 函数。

于 2009-03-05T17:11:07.990 回答
0

你为什么不用一张以上的桌子?

CREATE TABLE user (
    user_id number not null (some form of auto increment or sequence),
    name varchar(50) not null,
    otherdata type,
    primary key (id));

CREATE TABLE common (
    common_id number not null (autoinc),
    user_id number not null,
    commondata type,
    primary key (common_id),
    unique index (user_id, common_id));

SELECT u.name, u.otherdata, c.commondata
FROM user u, common c
WHERE u.user_id = c.user_id

TABLE user
user_id  name   otherdata
1        Sam    abc
2        Jack   def
3        Sue    ghi

Table common
common_id user_id  commondata
1         1        AAA
2         1        BBB
3         1        CCC
4         2        DDD
5         3        EEE
6         3        FFF

Output
name   otherdata  commondata
Sam    abc        AAA
Sam    abc        BBB
Sam    abc        CCC
Jack   def        DDD
Sue    ghi        EEE
Sue    ghi        FFF
于 2009-03-05T18:22:14.823 回答