1

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

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

我通过交叉连接一个供应商表获得了该表格 - 现在我需要确保它只有一个记录 - 所以要么在代码块顶部,要么:

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

例子:

Märzen AG | 迈尔幼儿园 | 乌尔姆

或者

迈尔幼儿园 | Märzen AG | 乌尔姆

因此:我只需要上述结果之一。目前,我从 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;

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

由于我不是母语人士,我希望我能说的足够让您理解我的问题。(因此可能错过了一个已经存在的对我有帮助的话题)。

4

2 回答 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子句中生成更具可读性和可维护性的查询。

于 2013-04-20T18:04:07.950 回答
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
于 2013-04-20T18:03:51.960 回答