如何结合这两个SQL查询结果?

时间:2016-12-14 06:42:36

标签: sql sql-server

第一次查询:

select top 1 isodeldocket, product from trans where container = '040' 
order by despatchdatetime desc

第二次质疑:

{{1}}

最后一个查询的结果将被添加为第一个查询的最后两列

1 个答案:

答案 0 :(得分:2)

解决查询中的问题

你可以这样做:

select 
  O.TrainDate, O.RailHead, O.Position as Pos, O.Iso, 
  C.CustomerName + ' (' + O.Customer + ')' as Customer, 
  P.ProductName + ' ('+ O.Product +')' as Product, 
  O.Target, O.Docket, O.Gross, O.Tare, O.Net, O.ConNote, O.Description, 
  -- Added these columns
  T.isodeldocket, 
  T.product
from 
  IsoOrders O, 
  Customer C, 
  Product P, 
  -- Added this derived table
  (select top 1 isodeldocket, product 
   from trans 
   where container = '040' 
   order by despatchdatetime desc) T
where O.Customer = C.Customer and P.Product = O.Product
and O.Traindate >= '12-14-2016'
and O.Iso = '040'

使用ANSI JOIN语法

改进查询

在您重构此查询时,为什么不转移到ANSI JOIN,这极大地简化了可读性并清楚地显示了(INNER) JOINCROSS JOIN之间的意图/差异:

select 
  O.TrainDate, O.RailHead, O.Position as Pos, O.Iso, 
  C.CustomerName + ' (' + O.Customer + ')' as Customer, 
  P.ProductName + ' ('+ O.Product +')' as Product, 
  O.Target, O.Docket, O.Gross, O.Tare, O.Net, O.ConNote, O.Description, 
  T.isodeldocket, 
  T.product
from IsoOrders O
join Customer C on O.Customer = C.Customer 
join Product P on P.Product = O.Product
-- CROSS JOIN more explicitly reveals your intention than a comma-separated table list
cross join (
  select top 1 isodeldocket, product 
  from trans 
  where container = '040' 
  order by despatchdatetime desc
) T
where O.Traindate >= '12-14-2016'
and O.Iso = '040'

将“外部”O.Iso与“内部”trans.container值相关联

根据您的评论,我认为您希望更进一步,避免重复'040'“参数”。这可以使用APPLY

在SQL Server中完成
select 
  O.TrainDate, O.RailHead, O.Position as Pos, O.Iso, 
  C.CustomerName + ' (' + O.Customer + ')' as Customer, 
  P.ProductName + ' ('+ O.Product +')' as Product, 
  O.Target, O.Docket, O.Gross, O.Tare, O.Net, O.ConNote, O.Description, 
  T.isodeldocket, 
  T.product
from IsoOrders O
join Customer C on O.Customer = C.Customer 
join Product P on P.Product = O.Product
-- Use CROSS APPLY rather than CROSS JOIN
cross apply (
  select top 1 isodeldocket, product 
  from trans 
  where container = O.Iso -- Now, you can access "outer" columns
  order by despatchdatetime desc
) T
where O.Traindate >= '12-14-2016'
and O.Iso = '040'
相关问题