Mysql 这种连接在SQL中可能吗?
我不知道该怎么问这个问题,所以我将举一个例子,看看SQL是否可以做到这一点 假设一个客户访问一家商店,系统会创建一个VisitID。然后,他在订单表中下订单,并链接到VisitID。然后,他在ShippingForms表中填写一张与就诊ID链接的发货表单。然后,系统在与就诊ID链接的ReceiptForms表中生成一张收据。然后,他在一个与VisitID链接的返回表单表中填写一个返回表单 那么,有没有一种方法可以查询系统以显示VisitID是否有订单记录、发货单记录、收据记录、退货记录?这在DBGrid中非常方便,可以显示该VisitID上客户的所有活动。每个表(订单、发货表单、收货表单、退货表单等)具有不同的结构和不同的字段,但由就诊ID链接,并且在就诊期间可能存在或不存在,或者可能有多个订单 所以——选择Orders、ShippingForm、ReceiptForm、ReturnForm,其中VisitID=x。 因此,我可以在网格中显示信息,例如:Mysql 这种连接在SQL中可能吗?,mysql,sql,Mysql,Sql,我不知道该怎么问这个问题,所以我将举一个例子,看看SQL是否可以做到这一点 假设一个客户访问一家商店,系统会创建一个VisitID。然后,他在订单表中下订单,并链接到VisitID。然后,他在ShippingForms表中填写一张与就诊ID链接的发货表单。然后,系统在与就诊ID链接的ReceiptForms表中生成一张收据。然后,他在一个与VisitID链接的返回表单表中填写一个返回表单 那么,有没有一种方法可以查询系统以显示VisitID是否有订单记录、发货单记录、收据记录、退货记录?这在DB
{
VisitID 2315
OrderID 1256
OrderID 1257
OrderID 1258
ReceiptID 5124
ReceiptID 5125
ReceiptID 5126
ShippingID 99023
ReturnID 582812
}
并非所有表中都有记录的访问:
Select *
from Visits v -- visit always exists
left join Orders o on o.visitId = v.visitId
left join ShippingForm s on s.visitId = v.visitId
left join ReceiptForm r on r.visitId = v.visitId
left join ReturnForm rf on fr.visitId - v.visitId
where v.VisitID=x
and (o.visitId is null or s.visitId is null or r.visitId is null or fr.visitId is null ) -- it is null when record does not exist
可能您正在寻找的是
UNION ALL
:
select visitid, type, id
from
(
select visitid, 'visit' as type, 1 as sortkey, null as id from visits
union all
select visitid, 'order' as type, 2 as sortkey, orderid as id from orders
union all
select visitid, 'receipt' as type, 3 as sortkey, receiptid as id from receipts
union all
select visitid, 'shipping' as type, 4 as sortkey, shippingid as id from shippings
union all
select visitid, 'return' as type, 5 as sortkey, returnid as id from returns
) data
order by visitid, sortkey;
或者您可能需要字符串聚合。这依赖于DBMS,您没有提到您的DBMS。这是针对MySQL的:
select
visitid,
ord.ids as orderids,
rcp.ids as receiptids,
shp.ids as shippingids,
ret.ids as returnids
from visits v
left join
(select visitid, group_concat(orderid) as ids from orders group by visitid) ord
using (visitid)
left join
(select visitid, group_concat(receiptid) as ids from receipts group by visitid) rcp
using (visitid)
left join
(select visitid, group_concat(shippingid) as ids from shippings group by visitid) shp
using (visitid)
left join
(select visitid, group_concat(returnid) as ids from returns group by visitid) ret
using (visitid)
order by visitid;
谢谢大家,你们允许我回答这个问题。出于我的目的,我将这些结果结合起来制作了这个sol
select
OrderID as FormID,
1 as FormType,
'Order ID' as FormTitle
from Orders O, Visits V where (O.VisitID=V.VisitID) and (V.VisitID=112)
union all
ShippingID as FormID,
2 as FormType,
'Shipping ID' as FormTitle
from Shipping S, Visits V where (S.VisitID=V.VisitID) and (V.VisitID=112)
等等。
现在有一个VisitID=112的逐行表:
FormID FormType FormTitle
23 1 Order ID
26 1 Order ID
28 1 Order ID
342 2 Shipping ID
343 2 Shipping ID
367 2 Shipping ID
FormID FormType FormTitle
23.1订单ID
26.1订单ID
28.1订单ID
342 2运输ID
343 2运输ID
367 2装运ID
您使用的是什么数据库管理系统?你应该总是用你要问的DBMS来标记SQL问题。我使用的是MySQL,谢谢。”这是MySQL的:“
GROUP\u CONCAT
也受我所知道的Google BigQuery和SQLite的支持。。但是我对使用select visitid,group_concat()有疑问代码>无按visitid分组
作为聚合列和非聚合列不能混合谢谢@Raymond Nijland。你当然是对的,我在键入子查询时忘记了GROUP BY
子句;有没有一种方法可以使用分组来列出结果,以便每个结果都像示例中那样是一个新行?我很高兴您找到了问题的答案。但是,不应该使用逗号分隔的连接。在标准SQL1992中,有一些是多余的。仍然使用它们被认为是不好的风格。您可能需要添加一个orderby
子句,以确保您首先获得订单,然后再发货<代码>全部联合
不能单独保证订单。您需要orderby来保证有序的结果。