我在几个字段(ID_1和ID_2)上有一个JOIN查询。
我的问题:当ID_2为空时,JOIN没有产生所需的结果
我可以加入ID_1&的串联ID_2在查询时?一些微弱的尝试没有帮助。
我不想在2个表中创建新索引,因为其中一个不属于我。
感谢您的任何建议。
我的查询的简化版本:
SELECT Table1.ID_1, Table1.ID_2, Table1.Name, Table2.ID_1, Table2.ID_2, Table2.Owner
FROM Table1
LEFT JOIN Table2 ON (Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1);
使用上面的查询,我会看到ID_1,ID_2&表1中的名称,但当ID_2为空时,表2中没有任何内容
示例(“替代”)数据:: :)
表1:
ID_1 ID_2 Name
===========================
A001 ACME Corp
A001 B001 ACME Medical
A001 B002 ACME Pharmacy
A002 General Electric Corp
A003 Philips
表2:
ID_1 ID_2 Owner
===========================
A001 Bob
A001 B001 Lori
A001 B002 Becky
A002 Ravi
A003 Joe
当我LEFT JOIN时,我希望将这两个表中的信息结合起来。描述的问题呈现以下结果 - 当ID_1和ID_2都是非空时(Owner = Null不是正确的结果)时,仅加入所有者:
加入(错误结果):
ID_1 ID_2 Name Owner
=========================================
A001 ACME Corp
A001 B001 ACME Medical Lori
A001 B002 ACME Pharmacy Becky
A002 General Electric
A003 Philips
答案 0 :(得分:0)
让我们看看JOINS:
INNER JOIN - 仅在两个表之间显示 COMMON ROWS 。如果连接表在 COMMON FIELD YOUR JOIN ON ON 中为NULL,则不显示该行。
LEFT JOIN - 包括左表中的所有行。右表中的非匹配条目将为NULL
RIGHT JOIN - 包含右表中的所有行。左表中的非匹配条目将为NULL
FULL JOIN - 包括左右表格中的所有行。左表和右表中的非匹配条目将为NULL。
使用 LEFT JOIN 将提供您想要的结果。
Select A.ID_1
,B.ID_2
From tableA A
LEFT JOIN tableB B
ON A.ID_1 = B.ID_2
答案 1 :(得分:0)
如果您必须使用有缺陷的表设计,您可以尝试这样的查询:
CREATE TABLE cars
(`id_person` INT, `id_car` INT, `value` INT)
;
INSERT INTO cars
(`id_person`, `id_car`, `value`)
VALUES
(1, 1, 1000),
(1, 2, 2000),
(2, 1, 2200),
(2, 2, 1100),
(3, 3, 3000)
;
答案 2 :(得分:0)
考虑以下变化。选择最容易维护或最有效的类型。
联盟查询
第一个SELECT
捕获具有匹配ID(ID_1 = ID_2
)和第二个SELECT
的记录会捕获两个表中只有ID_1
匹配但只有ID_2 IS NULL
的记录。
SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1
INNER JOIN [Table2] t2 ON t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2
UNION ALL
SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1
INNER JOIN [Table2] t2 ON t1.ID_1 = t2.ID_1
WHERE t1.ID_2 IS NULL AND t2.ID_2 IS NULL;
或者,考虑单SELECT
个语句:
明确加入 (在OR
子句中ON
SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1
INNER JOIN [Table2] t2 ON (t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2)
OR (t1.ID_1 = t2.ID_1 AND t1.ID_2 IS NULL AND t2.ID_2 IS NULL);
隐式加入 (没有明确JOIN
的查询)
SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner
FROM [Table1] t1, [Table2] t2
WHERE (t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2)
OR (t1.ID_1 = t2.ID_1 AND t1.ID_2 IS NULL AND t2.ID_2 IS NULL);
以上各项应返回(但不一定按相同顺序)以下输出:
-- ID_1 ID_2 Name Owner
-- A001 ACME Corp Bob
-- A001 B001 ACME Medical Lori
-- A001 B002 ACME Pharmacy Becky
-- A002 General Electric Corp Ravi
-- A003 Philips Joe