我需要通过它们所在的城市配对2个供应商名称。
<name supplier a> <name supplier b> <location>
我通过Crossjoining一个Supplier表获得了这个表单 - 现在我需要确保它只有一个记录 - 所以要么在代码块顶部或者:
<name supplier b> <name supplier a> <location>
例:
MärzenAG| Maier KG |乌尔姆
要么
Maier KG | MärzenAG|乌尔姆
因此:我只需要上述结果之一。目前我从Crossjoin中获取两个记录:
SELECT le.Liefname, le.liefstadt, li.Liefname
FROM Lieferanten le CROSS JOIN Lieferanten li
WHERE le.Liefstadt not like ''
AND li.Liefstadt not like ''
AND le.liefstadt=li.liefstadt;
liefstadt是配对它们的城市,而liefname是我需要输出的名称。
我想要做的另一种方法是:
SELECT a.LiefName, b.LiefName, LiefStadt
FROM Lieferanten a, Lieferanten b
WHERE a.LiefStadt = b.LiefStadt
AND a.LiefName <> b.LiefName;
这里的问题是结果中仍然存在重复。
我希望我可以说足以让你理解我的问题,因为我不是母语人士。 (因此可能错过了一个对我有帮助的现有主题)。
你只需要调整你的第一种方法:
SELECT le.Liefname, le.liefstadt, li.Liefname
FROM Lieferanten le CROSS JOIN Lieferanten li
WHERE le.Liefstadt not like ''
AND li.Liefstadt not like ''
AND le.liefstadt=li.liefstadt
AND le.Liefname < li.Liefname
我建议您更改查询以使用连接,以便表之间的条件是显而易见的。
SELECT le.Liefname, le.liefstadt, li.Liefname
FROM Lieferanten le JOIN
Lieferanten li
on le.liefstadt=li.liefstadt and
le.Liefname < li.Liefname
WHERE le.Liefstadt not like '' and
li.Liefstadt not like ''
虽然不是必需的,但使用on
子句来比较两个表中的字段的条件会产生比将这些条件放在where
子句中更可读和可维护的查询。
您可以使用a.LiefName < b.LiefName
始终首先列出最小的名称。如有必要,如果表格本身有重复项,请添加DISTINCT
。
SELECT DISTINCT a.LiefName
, b.LiefName
, a.LiefStadt
FROM Lieferanten a
JOIN Lieferanten b
ON a.LiefStadt = b.LiefStadt
WHERE a.LiefStadt <> ''
and a.LiefName < b.LiefName