Mysql 这种连接在SQL中可能吗?

Mysql 这种连接在SQL中可能吗?,mysql,sql,Mysql,Sql,我不知道该怎么问这个问题,所以我将举一个例子,看看SQL是否可以做到这一点 假设一个客户访问一家商店,系统会创建一个VisitID。然后,他在订单表中下订单,并链接到VisitID。然后,他在ShippingForms表中填写一张与就诊ID链接的发货表单。然后,系统在与就诊ID链接的ReceiptForms表中生成一张收据。然后,他在一个与VisitID链接的返回表单表中填写一个返回表单 那么,有没有一种方法可以查询系统以显示VisitID是否有订单记录、发货单记录、收据记录、退货记录?这在DB

我不知道该怎么问这个问题,所以我将举一个例子,看看SQL是否可以做到这一点

假设一个客户访问一家商店,系统会创建一个VisitID。然后,他在订单表中下订单,并链接到VisitID。然后,他在ShippingForms表中填写一张与就诊ID链接的发货表单。然后,系统在与就诊ID链接的ReceiptForms表中生成一张收据。然后,他在一个与VisitID链接的返回表单表中填写一个返回表单

那么,有没有一种方法可以查询系统以显示VisitID是否有订单记录、发货单记录、收据记录、退货记录?这在DBGrid中非常方便,可以显示该VisitID上客户的所有活动。每个表(订单、发货表单、收货表单、退货表单等)具有不同的结构和不同的字段,但由就诊ID链接,并且在就诊期间可能存在或不存在,或者可能有多个订单

所以——选择Orders、ShippingForm、ReceiptForm、ReturnForm,其中VisitID=x。 因此,我可以在网格中显示信息,例如:

{
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来保证有序的结果。