在此SQLite示例中,我使用公用列'aa'从表a,b和c中选择行。
SELECT
a.aa,
a.ab,
a.ac,
b.ba,
b.bb,
b.bc,
c.ca,
c.cb,
c.cc
FROM
a
INNER JOIN b ON b.ba = a.aa
INNER JOIN c ON c.ca = a.aa
WHERE a.ab = 'blahblah'
这正常。现在,我需要添加一个额外的表和一个额外的JOIN。表“ d”具有与表“ c”及其列“ c.cc”相同的列“ d.dc”。 在“ c”中选择正确的行后,我希望能够读取“ d.dd”中的数据。
SELECT
a.aa,
a.ab,
a.ac,
b.ba,
b.bb,
b.bc,
c.ca,
c.cb,
c.cc,
d.dc,
d.dd
FROM
a
INNER JOIN b ON b.ba = a.aa
INNER JOIN c ON c.ca = a.aa
INNER JOIN d ON d.dc = c.cc
WHERE a.ab = 'blahblah'
这不能正常工作。请您告诉我如何纠正它? 我也尝试过
FOREIGN KEY (cc) REFERENCES d(dc)
在表“ c”的定义中,但没有明显区别。
这是我的表定义:
CREATE TABLE `a` ( `aa` TEXT PRIMARY KEY UNIQUE, `ab` TEXT, `ac` TEXT );
CREATE TABLE `b` ( `ba` TEXT PRIMARY KEY UNIQUE, `bb` TEXT, `bc` TEXT );
CREATE TABLE `c` ( `ca` TEXT PRIMARY KEY UNIQUE, `cb` TEXT, `cc` TEXT, FOREIGN KEY (cc) REFERENCES d(dc) );
CREATE TABLE `d` ( `dc` TEXT PRIMARY KEY UNIQUE, `dd` TEXT );
我得到的奇怪结果很难描述,但是我注意到的一件事是,返回的仅有的几行是c.cc都具有相同的值,而实际上应该有更多的行,而c .cc应该具有各种值。
答案 0 :(得分:1)
也许以下内容将解释如何使用SQL进行联接(但这实际上只是为满足规则而定制的):-
DROP TABLE IF EXISTS a;
DROP TABLE IF EXISTS b;
DROP TABLE IF EXISTS c;
DROP TABLE IF EXISTS d;
CREATE TABLE `a` ( `aa` TEXT PRIMARY KEY UNIQUE, `ab` TEXT, `ac` TEXT );
CREATE TABLE `b` ( `ba` TEXT PRIMARY KEY UNIQUE, `bb` TEXT, `bc` TEXT );
CREATE TABLE `c` ( `ca` TEXT PRIMARY KEY UNIQUE, `cb` TEXT, `cc` TEXT, FOREIGN KEY (cc) REFERENCES d(dc) );
CREATE TABLE `d` ( `dc` TEXT PRIMARY KEY UNIQUE, `dd` TEXT );
INSERT INTO d VALUES('blah_c_cc_001','blahblah_d_dd'); -- MUST BE INSERTED BEFORE C else FK CONFLICT
INSERT INTO a VALUES('blah_a_aa_001','blahblah','blahblah_a_ac');
INSERT INTO b VALUES('blah_a_aa_001','blahblah_b_bb','blahblah_b_bc');
INSERT INTO c VALUES('blah_a_aa_001','blahblah_c_cb','blah_c_cc_001');
INSERT INTO d VALUES('blah_c_cc_002','blahblah_d_dd'); -- MUST BE INSERTED BEFORE C else FK CONFLICT
INSERT INTO a VALUES('blah_a_aa_002','blahblah','blahblah_a_ac');
INSERT INTO b VALUES('blah_a_aa_002','blahblah_b_bb','blahblah_b_bc');
INSERT INTO c VALUES('blah_a_aa_002','blahblah_c_cb','blah_c_cc_002');
INSERT INTO d VALUES('blah_c_cc_004','blahblah_d_dd');
INSERT INTO a VALUES('blah_a_aa_003','blahblah','blahblah_a_ac');
INSERT INTO b VALUES('blah_a_aa_003','blahblah_b_bb','blahblah_b_bc');
INSERT INTO c VALUES('blah_a_aa_003','blahblah_c_cb','blah_c_cc_004');
SELECT *
FROM
a
INNER JOIN b ON b.ba = a.aa
INNER JOIN c ON c.ca = a.aa
INNER JOIN d ON d.dc = c.cc
WHERE a.ab = 'blahblah'
;
- *
为简洁起见
结果为:-
基本上,规则是对于INNER(普通/简单)JOIN,必须有匹配的行,因此在您的查询中(以下内容适用)
表d中的dc列中的值必须与表c中的cc列相匹配,并且cc中的匹配行是与表a中的行相匹配且在ab列中具有blahblah值的行/ p>
FOREIGN KEY对SELECT查询没有影响,除了它限制了表c中行的插入之外,因为要插入的cc列必须与表中某行中的dc列的值匹配d。
答案 1 :(得分:0)
好的,我发现了问题。原始代码还可以,但是问题出在我使用的外部数据中。之所以不匹配,是因为在将其加载到数据库之前,我没有理会TRIM。
发生我的奇怪结果是因为,如果表d中的dc列中没有与表c中的cc列匹配的值,则根本不会返回任何行。我假设如果表d中的dc列中没有与表c中的cc列匹配的值,那么SELECT d.dd只会返回空结果,而实际上它阻止了所有输出。
给自己的消息:始终对数据进行修剪。另外,在监视结果时,请始终用引号引起来,以便看到额外的空格。