SQL:具有相似表的多个左连接

Posted

技术标签:

【中文标题】SQL:具有相似表的多个左连接【英文标题】:SQL : Multiple left joins with similar tables 【发布时间】:2018-05-01 11:30:45 【问题描述】:

我有以下表格:

TABLE A
id
info

TABLE B
f_id
question
choices

TABLE C
f_id
question
lines

表 A 中的 id 始终与表 B 或 C 中的 f_id 匹配,但绝不会同时匹配两者。我只想在表 A 匹配时加入表 B 和表 C,因此我会得到一个包含以下列的表:

id |   info   |   question   | choices | lines

所有行都填写在问题列中,有些在列选择中为 NULL,有些在列行中为 NULL。

我尝试的是做两个连续的左连接,但第二个覆盖第一个,因此表 C 中不匹配的所有行(第二个左连接)在问题列中获得 NULL 值。

有没有办法进行查询,不会覆盖以前使用 NULL 值连接的数据?我正在使用 Laravel Eloquent,因此任何原始 SQL 或 Eloquent Query 都会对我有所帮助。

【问题讨论】:

考虑在 A 和 B 和 C 的外连接之间进行内连接。 查看此定义以获得帮助:***.com/questions/38549/… 你应该使用关系...laravel.com/docs/5.5/eloquent-relationships 我会为此使用联合 如果您使用 laravel,我不明白您为什么要使用 Raw SQL... 【参考方案1】:

UNION BC 然后 INNER JOIN A 到这些结果。

SELECT s1.f_id, s1.question, s1.choices, s1.lines
FROM 
(
  SELECT f_id, question, choices, lines = null
  FROM B
  UNION 
  SELECT f_id, question, choices = null, lines
  FROM C
) s1
INNER JOIN A ON s1.f_id = A.id

【讨论】:

【参考方案2】:

但绝不会两者兼而有之

祝你好运。

标识 |信息 |问题 |选择 |线条

SELECT a.id, a.info, b.question, b.choices, '' AS lines
FROM tableA as A
LEFT JOIN tableB AS b
ON a.id=b.f_id
UNION
SELECT a.id, a.info, c.question, '', c.lines
FROM tableA as A
INNER JOIN tableC AS c
ON a.id=c.f_id

【讨论】:

第一个查询总是返回表 a 中的所有行。第二个查询有时会返回表 a 中的行。这意味着有时你会得到重复。如果 OP 意味着表 a 中的行在表 b 或 c 中总是有一个且完全匹配的行,您可以将左连接更改为内连接。并将该 UNION 更改为 UNION ALL...【参考方案3】:

您可以使用UNION 组合两个不同的查询。

SELECT 
    `id`, `info`, `question`, `choices` AS `lines`
FROM
    `TABLE_A`  INNER JOIN
    `TABLE_B` ON `TABLE_A`.`id` = `TABLE_B`.`f_id` 

UNION 

SELECT 
    `id`, `info`, `question`, `lines`
FROM
    `TABLE_A` INNER JOIN
    `TABLE_C` ON `TABLE_A`.`id` = `TABLE_C`.`f_id`

确保使用 JOININNER JOINJOINmysql 上默认为 INNER JOIN)而不是 LEFT JOINRIGHT JOINOUTER JOIN,否则您将得到部分填充的结果。

【讨论】:

以上是关于SQL:具有相似表的多个左连接的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 postmeta 左连接的 Wordpress 自定义 SQL 查询

允许同一个表的多个左外连接?

具有多个左外连接的 SQL Server 查询挂起

当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]

我在 oracle sql 中的左连接没有返回左表的每个元素

sql语句左连接右连接区别