如何将具有相同字段的两个表的结果连接到一个字段中?

时间:2010-11-29 14:48:31

标签: sql mysql join union

我有这样的表:

   Table1                Table2
   name1 | link_id      name2  |  link_id
   text       1         text         2
   text       2         text         4

我想要结果:

name1     name2     link_id
text      text         1
text      text         2
text      text         4

我怎么能这样做?

ADD: Sry,我的英语不太好。我有设备,device_model和device_type表与重复字段counter_set_id。我想从counter_set中选择具有counter_set_id的所有值的字段。我只需要从counter_set_id字段中获取值

现在我有了这个问题:

SELECT  `dev`.`counter_set_id`, `mod`.`counter_set_id`, `type`.`counter_set_id`
FROM    `device` AS `dev`
LEFT JOIN   `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id`
LEFT JOIN   `device_type` AS `type` ON `mod`.`device_type_id` = `type`.`id`
WHERE   `dev`.`id` = 4;

这会返回3列,但我需要一列中的所有值

这是我认为的最终变体:

SELECT  `dev`.`counter_set_id`
FROM        `device` AS `dev` LEFT OUTER JOIN
        `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id`
WHERE   `dev`.`id` = 4 AND
        `dev`.`counter_set_id` IS NOT NULL
UNION
SELECT  `mod`.`counter_set_id`
FROM        `device_model` AS `mod` LEFT OUTER JOIN
        `device` AS `dev` ON `mod`.`id` = `dev`.`device_model_id`
WHERE   `mod`.`counter_set_id` IS NOT NULL;

7 个答案:

答案 0 :(得分:7)

根据您提供的样本表和所需的输出,听起来您可能想要一个FULL OUTER JOIN。并非所有供应商都实现了这一点,但您可以使用LEFT OUTER连接和UNION到EXCEPTION连接来模拟它,并将表格反转为:

Select name1, name2, A.link_id
From table1 A Left Outer Join
     table2 B on A.link_id = B.link_id
Union
Select name1, name2, link_id
From table2 C Exception Join
     table1 D on C.link_id = D.link_id

然后您的输出将是这样的:

NAME1   NAME2    LINK_ID
=====   =====    =======
text    <NULL>         1
text    text           2
<NULL>  text           4

答案 1 :(得分:4)

起初我认为加入会起作用,但现在我不确定......我在想某种类型的联盟。

老实说,这是一个糟糕的设计imo。

select * from table1
union
select * from table2

答案 2 :(得分:3)

我假设你加入link_id字段。正常连接将导致返回四行(其中两行相同)。你真正要求的不是组合字段,而只是获取不同的行。

只需使用distinct关键字:

select distinct t1.name1, t2.name2, t1.link_id
from Table1 as t1
inner join Table2 as t2
    on t1.link_id = t2.link_id

答案 3 :(得分:1)

link_id 4对name1有什么价值? link_id 1对name2有什么价值?

尝试查找不同的JOIN-Types ..

http://dev.mysql.com/doc/refman/5.0/en/join.html

也许我误解了手头的问题 - 对不起。

欢呼声

答案 4 :(得分:1)

如果三列具有相同的值,则只需

SELECT  `type`.`counter_set_id`
FROM ...

或者,更好的是,如果它们具有相同的值,您可以这样做:

SELECT  `dev`.`counter_set_id`
FROM    `device` AS `dev`
WHERE   `dev`.`id` = 4;

如果要连接它们(将它们全部放在同一个字段中),请使用:

SELECT  CONCAT(
   CAST(`dev`.`counter_set_id` AS CHAR),
   ',',
   CAST(`mod`.`counter_set_id` AS CHAR),
   ',',
   CAST(`type`.`counter_set_id` AS CHAR))
FROM ...

答案 5 :(得分:1)

如果您不想重复字段结果,请在查询结尾处使用GROUP BY link_id

如果您只想显示link_id字段:

SELECT DISTINCT ta.link_id
FROM tblA AS ta
INNER JOIN tblB AS tb
ON ta.link_id = tb.link_id

还要在mysql手册上查找CONCATCAST和其他有用的函数 我希望这能帮到你。

答案 6 :(得分:1)

在临时表中选择所有ID(但是在MySQL中可以使用 - 在SQL Server中是CTE),并将其用作您的连接表。