多列连接和不同



有人可以澄清究竟是如何这些连接在一起,我知道如何连接在SQL的工作,但这似乎相当混乱。我很困惑查询是如何相互连接的,我试图分解查询并单独运行它们,但它失败了,我真的很感谢任何关于这方面的建议。

select distinct
[Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung].[cBestellnummer] as [OrderNumber],
[Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung].[dBestelldatum] as [OrderDate],
[Mandant_5].[RM].[lvRetoureLieferscheinPos].[cArtNr] as [Artikelnummer],
[Mandant_5].[RM].[lvRetoureLieferscheinPos].[cName] as [Bezeichnung], --not required
[Mandant_5].[dbo].[tArtikel].[cASIN] as [ASIN],
[Mandant_5].[DbeS].[vLieferscheinPosition].[fAnzahl] as [Menge],
[Mandant_5].[Rechnung].[tRechnungPositionEckdaten].[fVKNettoGesamt] as [Netto-VK (Gesamt)],-- not required
([Mandant_5].[Rechnung].[tRechnungPositionEckdaten].[fVKNettoGesamt]/[Mandant_5].[DbeS].[vLieferscheinPosition].[fAnzahl]) as [Netto-VK], -- not required
[Mandant_5].[Rechnung].[tRechnungPositionEckdaten].[fVKBrutto] as [Brutto-VK],
[Mandant_5].[SCX].[vOrderShippingShippedFrom].[cCountryIso] as [Country],
[Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung].[cZahlungsartbezeichnung] as [Zahlungsart],-- not required
[Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung].[fBetrag] as [Betrag] -- question
from [Mandant_5].[Rechnung].[tRechnungPositionEckdaten]
join [Mandant_5].[Rechnung].[tRechnungLieferscheinPosition]
on [Mandant_5].[Rechnung].[tRechnungPositionEckdaten].[kRechnungPosition] = [Mandant_5].[Rechnung].[tRechnungLieferscheinPosition].[kRechnungPosition]
join [Mandant_5].[DbeS].[vLieferscheinPosition]
on [Mandant_5].[Rechnung].[tRechnungLieferscheinPosition].[kLieferscheinPosition] = [Mandant_5].[DbeS].[vLieferscheinPosition].[kLieferscheinPos]
join [Mandant_5].[RM].[lvRetoureLieferscheinPos]
on [Mandant_5].[RM].[lvRetoureLieferscheinPos].[kLieferscheinPos] = [Mandant_5].[Rechnung].[tRechnungLieferscheinPosition].[kLieferscheinPosition]
join [Mandant_5].[dbo].[tArtikel]
on [Mandant_5].[dbo].[tArtikel].[cArtNr] = [Mandant_5].[RM].[lvRetoureLieferscheinPos].[cArtNr]
join [Mandant_5].[SCX].[vOrderShippingShippedFrom]
on [Mandant_5].[SCX].[vOrderShippingShippedFrom].[kAuftrag] = [Mandant_5].[RM].[lvRetoureLieferscheinPos].[kAuftrag]
join [Mandant_5].[Statistik].[vRechnung]
on [Mandant_5].[Statistik].[vRechnung].[kAuftrag] = [Mandant_5].[RM].[lvRetoureLieferscheinPos].[kAuftrag]
join [Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung]
on [Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung].[cRechnungsnummer] = [Mandant_5].[Statistik].[vRechnung].[cRechnungsnr]

我敢肯定,复杂的表引用使读取查询变得更加困难。因此,为了帮助(即使只是为了您自己的理解),我建议为每个表授予一个别名,这将有助于减少多部分表/列引用的数量。

SELECT DISTINCT 
PositionEckdaten.[fVKNettoGesamt]                 AS [Netto-VK (Gesamt)]
-- , PositionEckdaten.[fVKBrutto]                      AS [Brutto-VK]

--   tRechnungLieferscheinPosition                     -- no columns from this table
, vLieferscheinPosition.[fAnzahl]                   AS [Menge]
-- , (PositionEckdaten.[fVKNettoGesamt] 
--     / vLieferscheinPosition].[fAnzahl])             AS [Netto-VK]
, LieferscheinPos.[cArtNr]                          AS [Artikelnummer]
, LieferscheinPos.[cName]                           AS [Bezeichnung]

-- , tArtikel.[cASIN]                                  AS [ASIN]

, ShippedFrom.[cCountryIso]                         AS [Country]

--   vRechnung                                         -- no columns from this table

, zuordnung.[cBestellnummer]                        AS [OrderNumber]
, zuordnung.[dBestelldatum]                         AS [OrderDate]
, zuordnung.[cZahlungsartbezeichnung]               AS [Zahlungsart]
-- , zuordnung.[fBetrag]                               AS [Betrag]

FROM [Mandant_5].[Rechnung].[tRechnungPositionEckdaten]           as PositionEckdaten
JOIN [Mandant_5].[Rechnung].[tRechnungLieferscheinPosition]       as tRechnungLieferscheinPosition ON PositionEckdaten.[kRechnungPosition] = tRechnungLieferscheinPosition.[kRechnungPosition]  
JOIN [Mandant_5].[DbeS].[vLieferscheinPosition]                   as vLieferscheinPosition         ON tRechnungLieferscheinPosition.[kLieferscheinPosition] = vLieferscheinPosition.[kLieferscheinPos]
JOIN [Mandant_5].[RM].[lvRetoureLieferscheinPos]                  as LieferscheinPos               ON tRechnungLieferscheinPosition.[kLieferscheinPosition] = LieferscheinPos].[kLieferscheinPos]  
JOIN [Mandant_5].[dbo].[tArtikel]                                 as tArtikel                      ON LieferscheinPos.[cArtNr] = tArtikel.[cArtNr]
JOIN [Mandant_5].[SCX].[vOrderShippingShippedFrom]                as ShippedFrom                   ON LieferscheinPos.[kAuftrag] = ShippedFrom].[kAuftrag]
JOIN [Mandant_5].[Statistik].[vRechnung]                          as vRechnung                     ON LieferscheinPos.[kAuftrag] = vRechnung.[kAuftrag]
JOIN [Mandant_5].[Zahlungsabgleich].[lvRechnungZahlungszuordnung] as zuordnung                     ON vRechnung.[cRechnungsnr] = zuordnung.[cRechnungsnummer]

此外,通过一些额外的格式化(如列别名的对齐),它更容易阅读。我还按照连接表的顺序重新排列了所选列。

在join中,我也重新安排了ON之后的顺序。例如

from t1
join t2 on t1.id = t2.pk -- I prefer to list the prerequisite table first in each join

这样排列,我相信你可以更容易地看到关系

<>之前从…作为PositionEckdaten加入……作为tRechnungLieferscheinPosition ONPositionEckdaten。[kRechnungPosition] = tRechnungLieferscheinPosition.[kRechnungPosition]加入……作为vLieferscheinPosition ONtRechnungLieferscheinPosition。[kLieferscheinPosition] = vLieferscheinPosition.[kLieferscheinPos]加入……as LieferscheinPos ONtRechnungLieferscheinPosition。[kLieferscheinPosition] = LieferscheinPos .[kLieferscheinPos]加入……如tArtikel ONLieferscheinPos。[cArtNr] = tArtikel.[cArtNr]加入……as ShippedFrom ONLieferscheinPos。[kAuftrag] = ShippedFrom].[kAuftrag]加入……as vrechunung ONLieferscheinPos。[kAuftrag] = vRechnung.[kAuftrag]加入……as zuordnung ONvrechung

。[crechunungsnr] = zuordnung。[crechnungsummer]总的来说,查询似乎相对简单,只有8个表内部连接在一起(所以不需要考虑外部连接),除了2个表外,所有表都在select子句中直接引用。这两个未引用的表是连接其他表所必需的。

没有什么可说的,除了8个连接表的几个列的select distinct可能不是最佳的。

相关内容

  • 没有找到相关文章

最新更新