SQL从一个表中配对列

问题描述 投票:1回答:2

我需要通过它们所在的城市配对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;

这里的问题是结果中仍然存在重复。

我希望我可以说足以让你理解我的问题,因为我不是母语人士。 (因此可能错过了一个对我有帮助的现有主题)。

sql duplicates derby
2个回答
2
投票

你只需要调整你的第一种方法:

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子句中更可读和可维护的查询。


0
投票

您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.