2011-02-28 142 views
0

我有表sql查询问题

表1

id text 
1 A 
1 B 
2 C 

表2

id text 
1 x 
1 f 
2 y 
2 z 

我想加入他们这样

1 A x 
1 B f 
2 C y 
2 z 

在我想换句话说查看来自table1和table2的按id,wi分组的所有文本没有重复。 任何想法?

更新:正如他们在评论中所说,逻辑不清楚,我会试着解释。 我有table_1中的当前值和table_2中的删除值。 客户希望查看按某个ID分组的一个表中的当前值和已删除的值。

+1

你想拥有它完全一样? – alex 2011-02-28 08:39:13

+0

是的,就像那样。 – mik 2011-02-28 08:50:56

+2

你能解释一下逻辑吗?你的要求没有多大意义 - 为什么'A'只能连接到'x'而不是'f'?他们都有'id = 1'。为什么不'A-> f,B-> x' - 表中没有数据解释想要的结果的逻辑......当Galz指出你的问题仍然没有很好地定义时, – Galz 2011-02-28 10:19:32

回答

1

简单的解决方案获得了接近你正在寻找

SELECT t1.id, t1.text, t2.text 
FROM tbl_1 t1 
    INNER JOIN tbl_2 t2 
    ON t1.id = t2.id 

这将创建输出

1 A x 
1 B x 
2 C y 
2 C z 

只有不同的是,现在是,应该以某种方式删除重复的文本xC

更新 前提:每个ID重复或者是在tbl_1或tbl_2不是两个!

除了上面的简单解决方案之外,加入分组选择将允许创建一种“CASE-Filters”来获得您想要的输出。

SELECT 
    t1.id, 
    CASE 
    WHEN t2.text = txt_i2 THEN t1.text 
    END AS txt_t1, 
    CASE 
    WHEN t1.text = txt_i1 THEN t2.text 
    END AS txt_t2 
FROM (
    SELECT 
     i1.id, 
     i1.text AS txt_i1, 
     i2.text AS txt_i2 
    FROM tbl_1 i1 
     INNER JOIN tbl_2 i2 
     ON i1.id = i2.id 
    GROUP BY id 
) i 
    INNER JOIN tbl_1 t1 
    ON i.id = t1.id 
    INNER JOIN tbl_2 t2 
    ON t1.id = t2.id 

您应该创建的视图tbl_1-tbl_2联接,以获得更多可读性SQL:

CREATE OR REPLACE VIEW V_tbl_1_2 AS (
SELECT 
    t1.id, 
    t1.text AS txt_1, 
    t2.text AS txt_2 
FROM tbl_1 t1 
    INNER JOIN tbl_2 t2 
    ON t1.id = t2.id 
) 
; 

SELECT 
    t.id, 
    CASE 
    WHEN t.txt_2 = i.txt_2 THEN t.txt_1 
    END AS txt_t1, 
    CASE 
    WHEN t.txt_1 = i.txt_1 THEN t.txt_2 
    END AS txt_t2 
FROM V_tbl_1_2 t 
    INNER JOIN (
    SELECT * 
    FROM V_tbl_1_2 
    GROUP BY id 
) i ON t.id = i.id 
; 
+0

不,这会给我dublicate行。我编辑了我的问题,使其更清晰 – mik 2011-02-28 09:14:11

+0

@mik是的,我知道那里的重复在第一位。 (不知道这是多么相关);-)检查更新的答案。 – 2011-02-28 10:24:50

+0

当前解决方案仅适用于相同的ID在tbl_1或tbl_2中重复但在tbl_1和tb_2中存在相同ID时重复的情况下无效 – 2011-02-28 10:45:15

0

使用MySQL VIEWJOIN

+0

我知道关于连接和意见,但我不知道如何执行这个特定的连接 – mik 2011-02-28 08:55:22

0

这工作,如果你可以在任意一个表中,如果每id不超过两个项目没有人有完整的重复。 (而且我还必须补充,这只能工作,如果MySQL是能够让人接受这个怪物,而不是与它呛。)

SELECT 
    COALESCE (t1.id, t2.id) AS id, 
    t1.text AS text1, 
    t2.text AS text2 
FROM (
    SELECT 
    t.id, 
    t.text, 
    CASE t.text WHEN m.text THEN 1 ELSE 2 END AS rowid 
    FROM table_1 t 
    INNER JOIN (
     SELECT id, MIN(text) AS text 
     FROM table_1 
     GROUP BY id 
    ) m ON t.id = m.id 
) t1 
FULL JOIN (
    SELECT 
    t.id, 
    t.text, 
    CASE t.text WHEN m.text THEN 1 ELSE 2 END AS rowid 
    FROM table_2 t 
    INNER JOIN (
     SELECT id, MIN(text) AS text 
     FROM table_2 
     GROUP BY id 
    ) m ON t.id = m.id 
) t2 
ON t1.id = t2.id AND t1.rowid = t2.rowid 
ORDER BY COALESCE (t1.id, t2.id), COALESCE (t1.rowid, t2.rowid)