这相当于LEFT JOIN
?
SELECT DISTINCT a.name, b.name
FROM tableA a,
(SELECT DISTINCT name FROM tableB) as b
似乎两个表之间没有链接。
是否有更简单/更有效的方式来写这个?
答案 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
因此,您可以看到将十字转换连接添加到交叉连接低于已返回的记录数,但不保证您将获得使用正确连接所获得的结果。鉴于您说表格是公司和公司地址,交叉加入是不太可能的。