SQL相当于LEFT JoIn?

时间:2010-03-08 20:02:36

标签: sql sql-server sql-server-2008 join

这相当于LEFT JOIN

SELECT DISTINCT a.name, b.name 
  FROM tableA a, 
       (SELECT DISTINCT name FROM tableB) as b

似乎两个表之间没有链接。

是否有更简单/更有效的方式来写这个?

5 个答案:

答案 0 :(得分:4)

不是,它等同于交叉或笛卡尔联接(非常糟糕),之后应用了一个独特的。很难用查询来了解你真正想要的是什么。

答案 1 :(得分:2)

这与

不一样
SELECT DISTINCT a.name, b.name
    FROM tableA a, tableB b

虽然我会质疑这个查询的目的。

答案 2 :(得分:2)

它是用于交叉连接的ANSI-89语法,产生笛卡尔积(这很糟糕)。使用ANSI-92 JOIN语法重写:

如果在SQL Server / Oracle / Postgres上,请使用:

    SELECT DISTINCT
           a.name,
           b.name
      FROM TABLEA a
CROSS JOIN (SELECT b.name 
              FROM TABLEB b) AS b

MySQL支持使用:

SELECT DISTINCT
       a.name,
       b.name
  FROM TABLEA a
  JOIN (SELECT b.name 
          FROM TABLEB b) AS b

我们需要知道是否有任何列将两个表之间的记录相互关联,以便更新查询以使用INNER JOIN或OUTER JOIN。

答案 3 :(得分:2)

我讨厌人们对笛卡尔联合的耻辱。如果使用得当,它们是非常好的 。我有一个工资单申请,我们必须将所有不同的税务机关应用于每个员工。所以,我有一张员工表和一张税务机关表。

无论如何..我只是想捍卫精彩的笛卡尔联盟。 (:

< /肥皂盒>

答案 4 :(得分:1)

由于没有加入字段,因此您有一个交叉连接。明显限制了删除重复项的记录总数,但可能仍未提供您想要的答案。

这样做。检查您获得的记录数。然后写一个左连接加入公司名称(或公司ID,这是你真正应该具有的连接字段,因为公司名称经常更改)。我敢打赌你会得到不同数量的记录。我这样做会有两个我方便的桌子,这就是我得到的: 表a有467条记录 表b有4413条记录 交叉联接有2060871 与distinct的交叉连接有826804 左连接有4712 内连接有893

因此,您可以看到将十字转换连接添加到交叉连接低于已返回的记录数,但不保证您将获得使用正确连接所获得的结果。鉴于您说表格是公司和公司地址,交叉加入是不太可能的。