SQL从一个表中配对列

时间:2013-04-20 17:54:09

标签: sql duplicates derby

我需要通过它们所在的城市配对2个供应商名称。

<name supplier a> <name supplier b> <location>

我通过交叉加入一个供应商表来获得该表格 - 现在我需要确保它只有一条记录 - 所以要么在代码块顶部或者:

 <name supplier b> <name supplier a> <location>

示例:

MärzenAG| Maier KG |乌尔姆

OR

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;

问题在于结果中仍然存在重复。

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

2 个答案:

答案 0 :(得分: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子句中放置这些条件更可读和可维护的查询。

答案 1 :(得分: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