【问题标题】:What's is wrong with this query? Left Join and Self Join这个查询有什么问题?左连接和自连接
【发布时间】:2021-06-30 15:54:46
【问题描述】:

我遇到了左加入和自加入的问题,如果有人可以提供帮助,我不知道如何解决。

我有两张桌子:

TABLE str_markers_example { id int PK, display_value varchar, short_code varchar } 表 str_results_example { id int PK, dna_result_id int, str_marker_id int, allele_1, allele_2 }

当我运行这个查询时,我得到 12 条记录:

SELECT
str_results_example.str_marker_id,
str_results_example.allele_1 AS progeny_a1, str_results_example.allele_2 AS progeny_a2
from str_results_example join str_markers_example on str_results_example.str_marker_id = str_markers_example.id
where str_results_example.dna_result_id = 85281

但是当我尝试使用带有左连接的自连接获得相同数量的记录时,我只获得 9 条记录:

SELECT
str_results_example.str_marker_id,
str_results_example.allele_1 AS progeny_a1, str_results_example.allele_2 AS progeny_a2,
dam_results.allele_1 AS dam_a1, dam_results.allele_1 AS dam_a2
from str_results_example
left join str_markers_example on str_results_example.str_marker_id = str_markers_example.id
left join str_results_example as dam_results on str_results_example.str_marker_id = dam_results.str_marker_id 
where str_results_example.dna_result_id = 85281 
and dam_results.dna_result_id = 30308

我尝试了左连接,但我不知道我做错了什么。

两个表的 SQL 转储:

CREATE TABLE str_results_example (
  id int NOT NULL,
  dna_result_id int NOT NULL,
  str_marker_id int NOT NULL,
  allele_1 int,
  allele_2 int
)
;

INSERT INTO str_results_example VALUES (140125, 85281, 1, 209, 219);
INSERT INTO str_results_example VALUES (140126, 85281, 2, 150, 158);
INSERT INTO str_results_example VALUES (140127, 85281, 3, 117, 121);
INSERT INTO str_results_example VALUES (140128, 85281, 4, 127, 133);
INSERT INTO str_results_example VALUES (140129, 85281, 5, 178, 182);
INSERT INTO str_results_example VALUES (140130, 85281, 6, 248, 254);
INSERT INTO str_results_example VALUES (140131, 85281, 7, 151, 161);
INSERT INTO str_results_example VALUES (140132, 85281, 8, 81, 89);
INSERT INTO str_results_example VALUES (140133, 85281, 9, 115, 117);
INSERT INTO str_results_example VALUES (140134, 85281, 10, 206, 206);
INSERT INTO str_results_example VALUES (140135, 85281, 13, 162, 168);
INSERT INTO str_results_example VALUES (140136, 85281, 16, 266, 270);
INSERT INTO str_results_example VALUES (8152, 30308, 3, 121, 125);
INSERT INTO str_results_example VALUES (7964, 30308, 1, 209, 221);
INSERT INTO str_results_example VALUES (8365, 30308, 10, 206, 206);
INSERT INTO str_results_example VALUES (8372, 30308, 13, 160, 162);
INSERT INTO str_results_example VALUES (8397, 30308, 16, 266, 266);
INSERT INTO str_results_example VALUES (8282, 30308, 8, 81, 97);
INSERT INTO str_results_example VALUES (8244, 30308, 7, 151, 151);
INSERT INTO str_results_example VALUES (8335, 30308, 9, 117, 119);
INSERT INTO str_results_example VALUES (8156, 30308, 5, 178, 182);
INSERT INTO str_results_example VALUES (8163, 30308, 6, 248, 248);
INSERT INTO str_results_example VALUES (5722, 3657, 1, 209, 219);
INSERT INTO str_results_example VALUES (5980, 3657, 4, 125, 127);
INSERT INTO str_results_example VALUES (5931, 3657, 3, 103, 117);
INSERT INTO str_results_example VALUES (5834, 3657, 2, 150, 158);
INSERT INTO str_results_example VALUES (6147, 3657, 6, 248, 254);
INSERT INTO str_results_example VALUES (6238, 3657, 8, 77, 89);
INSERT INTO str_results_example VALUES (6266, 3657, 11, 141, 145);
INSERT INTO str_results_example VALUES (5989, 3657, 5, 178, 182);
INSERT INTO str_results_example VALUES (6194, 3657, 7, 151, 161);
INSERT INTO str_results_example VALUES (6335, 3657, 12, 141, 151);
INSERT INTO str_results_example VALUES (6404, 3657, 13, 166, 168);
INSERT INTO str_results_example VALUES (6243, 3657, 9, 115, 117);
INSERT INTO str_results_example VALUES (6253, 3657, 10, 206, 214);


CREATE TABLE str_markers_example (
  id int NOT NULL,
  display_value varchar(255),
  short_code varchar(255)
)
;

INSERT INTO str_markers_example VALUES (1, 'ETH10', 'eth_10');
INSERT INTO str_markers_example VALUES (2, 'ETH225', 'eth_225');
INSERT INTO str_markers_example VALUES (3, 'ETH3', 'eth_3');
INSERT INTO str_markers_example VALUES (4, 'BM2113', 'bm_2113');
INSERT INTO str_markers_example VALUES (5, 'BM1824', 'bm_1824');
INSERT INTO str_markers_example VALUES (6, 'SPS115', 'sps_115');
INSERT INTO str_markers_example VALUES (7, 'TGLA122', 'tgla_122');
INSERT INTO str_markers_example VALUES (8, 'TGLA227', 'tgla_227');
INSERT INTO str_markers_example VALUES (9, 'TGLA126', 'tgla_126');
INSERT INTO str_markers_example VALUES (11, 'MGTG4B', 'mgtg_4b');
INSERT INTO str_markers_example VALUES (13, 'TGLA53', 'tgla_53');
INSERT INTO str_markers_example VALUES (14, 'TGLA57', 'tgla_57');
INSERT INTO str_markers_example VALUES (15, 'TGLA48', 'tgla_48');
INSERT INTO str_markers_example VALUES (16, 'BM1818', 'bm_1818');
INSERT INTO str_markers_example VALUES (10, 'INRA23', 'inra_23');
INSERT INTO str_markers_example VALUES (12, 'SPS113', 'sps_113');

我要做的是进行查询,保留第一个 dna_results_id 中的所有数据(标记)并从第二个 dna_result_id 中获取所有匹配项

所以表格应该是这样的:

click to see the image

【问题讨论】:

  • 请添加示例输入和输出数据。顺便说一句,第二个查询使用了别名dam_results,似乎从未在任何地方定义过。
  • dam_results 正在左连接中定义(左连接 str_results_example 为 dam_results)。我认为我一直在谈论的问题是 dna_results_id 不为空,并且因为它们有 id,所以它就像一个正常的连接。我只是想知道如何保留第一个 dna_results_id = 85281 的所有记录

标签: sql postgresql


【解决方案1】:

在第二个查询中,您在 where 子句中的 dam_results.dna_result_id 上添加一个条件。那时你在 dma_results 上的加入变成了正常的加入,不再被视为左加入。您必须将您的条件放在左连接中,然后您将拥有 12 行。

SELECT
str_results_example.str_marker_id,
str_results_example.allele_1 AS progeny_a1, str_results_example.allele_2 AS progeny_a2,
dam_results.allele_1 AS dam_a1, dam_results.allele_1 AS dam_a2
from str_results_example
left join str_markers_example on str_results_example.str_marker_id = str_markers_example.id
left join str_results_example as dam_results on str_results_example.str_marker_id = dam_results.str_marker_id and dam_results.dna_result_id = 30308
where str_results_example.dna_result_id = 85281 

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多