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-那么这一行将不会进入决赛,如果我不使用它-它将返回太多的行:(谢谢,伙计们!我错过了左边的部分。这就是我需要的!