0

我找到了很多方法来只显示不同的结果,但是我如何同时选择不同的和非不同的结果呢?考虑这些表:

    A
    ---------------------------------
    |    id    |   col1   |   col2  |
    ---------------------------------
    |    1     |    aa    |   dd    |
    ---------------------------------
    |    1     |    bb    |    ee   |
    ---------------------------------
    |    2     |    cc    |    ff   |
    ---------------------------------

    B
    ---------------------------------
    |    id    |   col1   |   col2  |
    ---------------------------------
    |    1     |    a     |    d    |
    ---------------------------------
    |    2     |    b     |    e    |
    ---------------------------------
    |    3     |    c     |    f    |
    ---------------------------------

    C
    ---------------------------------
    |    id    |   col1   |   col2  |
    ---------------------------------
    |    1     |    x     |    1a   |
    ---------------------------------
    |    2     |    y     |    2b   |
    ---------------------------------
    |    3     |    x     |    3c   |
    ---------------------------------

一个用户向我提供了一个 id 和一个列列表,比如 id = 1 和 columns = (a.col1、b.col1 和 c.col2)。无论 id 出现多少次,我将如何构造一个查询来为我提供 id 匹配的所有列信息?

我目前的查询是:

    SELECT a.col1, b.col1, c.col2
    FROM a
        LEFT JOIN b
            ON b.id = a.id
        LEFT JOIN c
            ON  c.id = b.id
    WHERE a.id = 1

问题是,当我想获得两个结果(或来自恰好具有匹配的重复 id 的任何表的所有结果)时,这只给了我来自表 A 的一个结果。注意:在表 A 中,列 id 和 col1 一起构成了主键,这就是我重复 id 的原因。

建议?

谢谢!

4

1 回答 1

1

在问题的数据中,表 A 中没有重复的 id。那么查询应该只返回 A 中的一行。

但是,您的查询有错误。第二个连接应该回到第一个表,而不是第二个:

SELECT a.col1, b.col1, c.col2
FROM a
    LEFT JOIN b
        ON b.id = a.id
    LEFT JOIN c
        ON  c.id = a.id
WHERE a.id = 1

如果该表中没有匹配项,您拥有c.id = b.id并且可能为 NULL。b.id

另外,根据您的描述,我想知道是否union是最好的方法:

select a.col1, 'a'
from a
where id = 1
union all
select b.col1, 'b'
from b
where id = 1
union all
select c.col2, 'c'
from c
where id = 1
于 2013-06-20T00:00:13.137 回答