Hi,

I've run into some puzzling behavior. I've tried to distill it to a
minimal case. In the final SELECT query below, the last LEFT JOIN clause
seems have the effect of an INNER JOIN in that its condition limits the
rows returned.   I can rewrite the query to get the desired result using
a UNION or CASE, but I'm curious to understand what's going on here.

This SQLite 3.6.22.

regards,

Mark

CREATE TABLE currency (
  cur CHAR(3),
  PRIMARY KEY (cur)
);

CREATE TABLE exchange (
  cur1 CHAR(3),
  cur2 CHAR(3),
  rate REAL,
  PRIMARY KEY (cur1, cur2)
);

INSERT INTO currency (cur) VALUES ('EUR');
INSERT INTO currency (cur) VALUES ('GBP');
INSERT INTO currency (cur) VALUES ('USD');

INSERT INTO exchange (cur1, cur2, rate) VALUES ('EUR', 'GBP', 0.85);
INSERT INTO exchange (cur1, cur2, rate) VALUES ('GBP', 'EUR', 1/0.85);

--Expected results
SELECT c1.cur cur1, c2.cur cur2, x.rate
FROM currency c1
CROSS JOIN currency c2
LEFT JOIN exchange x
    ON x.cur1=c1.cur
    AND x.cur2=c2.cur;

/* results
EUR|EUR|
EUR|GBP|0.85
EUR|USD|
GBP|EUR|1.17647058823529
GBP|GBP|
GBP|USD|
USD|EUR|
USD|GBP|
USD|USD|
*/

--Gives unexpected results
SELECT c1.cur cur1, c2.cur cur2, COALESCE(self.rate, x.rate) rate
FROM currency c1
CROSS JOIN currency c2
LEFT JOIN exchange x
    ON x.cur1=c1.cur
    AND x.cur2=c2.cur
LEFT JOIN (SELECT 1 rate) self
    ON c1.cur=c2.cur;

/* results

EUR|EUR|1
GBP|GBP|1
USD|USD|1

*/

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to