我有一张顾客桌和一张船到桌子。有一对多的关系,但没有必要为客户提供船只。
我知道:
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
有没有办法用内/左/右/外连接来做到这一点?我知道我可以用工会来做,我只是不想使用工会。
感谢。
答案 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