1

我有三个表a,它们b之间cid共同点。

Table a:-
id      name      value
 1        a         4
 2        v          6

Table b:-
id      abc
 2        54
 3        56

Table c:-
id       bcd
1         54
3         34

现在我想要的是 id 在 where 条件下,数据来自所有表。

请建议我如何做到这一点。

预期结果-

如果查询是

select * from a left join b on a.id=b.id left join c on a.id=c.id where b.id=3

id  name   value   bcd   abc
3    NULL  NULL    34    56

如果查询是

select * from a left join b on a.id=b.id left join c on a.id=c.id where a.id=1

id  name   value   bcd   abc
3    a      4       54    NULL
4

4 回答 4

3

这种解决问题的方法怎么样?:)

SELECT 
    z.id,
    a.name,
    a.value,
    c.bcd,
    b.abc
FROM 
    (
        SELECT
            DISTINCT y.id id
        FROM
            (
                SELECT id FROM a
                    UNION ALL
                SELECT id FROM b
                    UNION ALL
                SELECT id FROM c
            ) y     
    ) z
    LEFT JOIN a ON z.id = a.id
    LEFT JOIN b ON z.id = b.id
    LEFT JOIN c ON z.id = c.id
where z.id = 3

sql小提琴

这样,您只需要为查询提供编号,而不关心它存在于哪些表中。

于 2013-07-25T08:18:02.073 回答
1

这取决于您设置的WHERE条件。如果您正在设置,WHERE b.ID = 3那么您需要将其他表与 B 连接起来,如下所示:

SELECT A.ID AS A_ID,A.Name, A.value
      ,B.Id as B_ID,B.abc
      ,C.id AS C_ID, c.bcd 
  FROM b 
  LEFT JOIN a ON a.id = b.id 
  LEFT JOIN c ON a.id = c.id 
 WHERE b.id=3;

发生这种情况是因为b.ID = 3不在表 A 中,并且表 C 与表 A 连接。如果设置表 A.ID = 1,则必须使用LEFT JOIN以下方法将其他表与 A 连接:

SELECT A.ID AS A_ID,A.Name, A.value
      ,B.Id as B_ID,B.abc
      ,C.id AS C_ID, c.bcd 
  FROM A 
  LEFT JOIN B ON a.id = b.id 
  LEFT JOIN c ON a.id = c.id 
 WHERE A.id=1;

看到这个 SQLFiddle

于 2013-07-25T07:11:17.790 回答
0

这在技术上是不可能的,当您在 where 中使用 ID 时,如果 Id 不存在于任何相关表中,您如何获取数据,您正在更改 where 的逻辑;)。

但你能做的是

SELECT * FROM (SELECT AID AS ID,NAME,VALUE FROM A UNION SELECT BID as ID,NAME,NULL AS VALUE FROM B UNION SELECT CID as ID,NAME ,NULL AS VALUE FROM C) WHERE ID =''

希望这可以帮助

否则请澄清。你想要什么。

问候

阿舒托什·艾莉亚

于 2013-07-25T06:45:48.717 回答
0

我会尝试猜测,即使我几乎找不到预期结果的解释:

SELECT 
    b.id,
    a.name,
    a.value,
    c.bcd,
    b.abc
FROM 
    b
    INNER JOIN c ON b.id = c.id
    LEFT JOIN a ON b.id = a.id

sql小提琴

于 2013-07-25T07:09:57.730 回答