Sql 跨多个表使用多个相互依赖的交叉应用

Sql 跨多个表使用多个相互依赖的交叉应用,sql,sql-server,performance,inner-join,cross-apply,Sql,Sql Server,Performance,Inner Join,Cross Apply,如何使用交叉应用(或内部联接)根据其他表中的值从一个表中获取数据 即,我有以下表格: 表说明: 普罗迪德 描述 TrackNum 361 测试1 499 388 测试2 003 004 5599 238 测试3 499 361 测试10 555 004 测试40 555 根据所需的描述,从发票表和where子句开始获取正确的行,然后加入产品和描述 我还猜您想匹配TrackNum上的描述?由于它似乎是唯一的描述每个ProdId/TrackNum组合 select [INV].[ProdID], [

如何使用
交叉应用
(或
内部联接
)根据其他表中的值从一个表中获取数据

即,我有以下表格:

表说明:

普罗迪德 描述 TrackNum 361 测试1 499 388 测试2 003 004 5599 238 测试3 499 361 测试10 555 004 测试40 555
根据所需的描述,从
发票
表和where子句开始获取正确的行,然后加入
产品
描述

我还猜您想匹配
TrackNum
上的
描述
?由于它似乎是唯一的
描述
每个
ProdId
/
TrackNum
组合

select [INV].[ProdID], [DES].[Description], [INV].[TrackNum]
from [Invoices] as [INV]
inner join [Products] as [GP] on [GP].[ProdID] = [INV].[ProdID]
inner join [Descriptions] on [DES].[ProdID] = [GP].[ProdID] and [DES].[TrackNum] = [INV].[TrackNum]
where [INV].[TrackNum] = '499' AND [INV].[InvoiceID] = '718'
order by [DES].[ProdID] asc;

注意:如果您希望在主表中的每行运行/评估某个内容,则通常仅对查询使用“交叉应用”。

在这种情况下,内部联接就足够了。您不需要使用交叉应用

SELECT
  *
FROM
  invoices   AS i
LEFT JOIN
  descriptions   AS d
    ON  d.prodid = i.prodid
    AND d.tracknum = i.tracknum -- you don't have this, but I think it's required.
LEFT JOIN
  products   AS p
    ON  p.prodid = i.prodid
WHERE
      i.invoiceid = 718
  AND i.tracknum = 499
ORDER BY
  i.prodid

我关心的一件事是,发票和说明都有一个名为
tracknum
的列,但您的查询和预期数据表明您不想将其包含在联接中?这非常令人困惑,可能是列名称不好,也可能是查询和示例结果中的错误。

您在任何地方都没有条件说明哪个描述记录与哪个发票记录关联。所以,你要将你找到的所有发票应用到每一个描述中。这可能会有帮助。。。看起来您可能可以使用而不是联接或交叉应用程序。您可能希望使其
选择不同的[INV].[ProdID],[DES].[Description],[INV].[TrackNum]
,以确保该应用程序中没有重复项joins@David784我不喜欢distinct,IMO使用
distinct
意味着没有正确设计查询。如果可能有重复的产品,请联系我的小组。但将等待OP的说明。可能需要保留JOIN,因为发票上有tracknum 499,但有一个描述中有tracknum5599@MatBailie我不会再去猜测了。。。他们可以澄清。答案应该完全回答问题,而不仅仅是给出更适合评论的提示。@DaleK感谢编辑,但我用大写强调了“不”一词;)改为粗体。。。(尽管可以随意更正输入错误,但我是在我的手机上这样做的,所以它很容易闻到鱼的味道。)这就是delema,我需要ProdID=004而没有说明(即使它是TrackNum=5599)才能在我的最终输出中。但是如果我使用AND d.tracknum=I.tracknum-那么这一行将不会进入决赛,如果我不使用它-它将返回太多的行:(谢谢,伙计们!我错过了左边的部分。这就是我需要的!