SQL中来自table1的所有记录和来自table2的记录,但更多

时间:2014-05-02 21:59:18

标签: sql join

我有一张顾客桌和一张船到桌子。有一对多的关系,但没有必要为客户提供船只。

我知道:

select c.customer,s.shipto
from custtable AS c
left join shiptotable AS s on c.customer=s.customer

将从客户那里提取所有记录,并向客户显示该船(如果客户没有船,则显示为NULL)。

但是,我想要的是所有客户,并且总是为第一艘船显示NULL,然后显示其他任何客户。

这样的东西
CustA       NULL
CustA       SHIP1
CustA       SHIP2
CustB       NULL
CustC       NULL
CustC       SHIP5
etc

有没有办法用内/左/右/外连接来做到这一点?我知道我可以用工会来做,我只是不想使用工会。

感谢。

2 个答案:

答案 0 :(得分:0)

你可以通过违反一些规则来做到这一点。您可以在shipto表中包含(null,null)对,并调整WHERE子句以确保它始终被选中。

INSERT INTO shipto VALUES ('Harry','Privet Drive')
INSERT INTO shipto VALUES ('Harry','Hogwarts')
INSERT INTO shipto VALUES (null,null)

您可以使用coalesce确保首先列出null

select c.customer,s.shipto
from custtable AS c
left join shipto AS s on c.customer=s.customer OR s.customer IS NULL
order by c.customer,coalesce(s.shipto,'')

这给了

Harry  NULL
Harry  Hogwarts
Harry  Privet Drive
Ron    NULL

当然, 应该在每个表上都有一个主键,如果你这样做,则shipto表不能有一个(null,null)行。

答案 1 :(得分:0)

您希望获得所有记录,但先使用null,然后使用流动脚本

select c.customer,s.shipto from custtable AS c
left join shiptotable AS s on c.customer=s.customer
order by shiptotable.shipto

如果您想根据客户和该客户的空值首先如下

CustA NULL  CustA SHIP1  CustA SHIP2  CustB NULL  CustC NULL  CustC SHIP5 等

然后你使用流动的脚本

select c.customer,s.shipto from custtable AS c
left join shiptotable AS s on c.customer=s.customer
order by custtable.customer, shiptotable.shipto