【问题标题】:Inner join returning more rows then exist in tables内部联接返回更多行然后存在于表中
【发布时间】:2022-01-05 09:38:48
【问题描述】:

直到今天我对内连接的想法是它将返回满足连接条件的表中存在的最小行数。

Ex. 如果 table A 包含 4 行,而 table B 包含 7 rows 。如果满足加入条件,我期望 4 行可以是最大输出。

我刚刚写了一个 sp,我在其中创建了两个临时表并填充它们。然后我对它们进行了内部连接,但返回了更多行(在我的情况下,返回了 29 行,我期待 4 行) 经过一番搜索,我发现了这个 link

这证实了我可以发生,但我仍然想知道我的选择是什么来限制返回的结果。

下面是我的存储过程。

ALTER PROCEDURE [dbo].[GetDDFDetailOnSiteCol]
@siteId int,
@colNum int
AS
BEGIN
SET NOCOUNT ON;

create Table #portDetail
(
ddfId int,
portDetail nvarchar(50),
siteId int
)
Insert into #portDetail SELECT  ddf.id,  ddf.portDetail, site.Site_ID  from site
        inner join ddf ON site.Site_ID = ddf.siteCodeID 
        where ddf.siteCodeID = @siteId and ddf.colNo= @colNum
        order by colNo,blockNum,portRowNum,portColNum

create Table #portAllocationDetail
(
assigned_slot nvarchar(50),
siteId int
)
Insert into #portAllocationDetail 
SELECT  dbo.portList.assigned_slot, dbo.site.Site_ID
FROM dbo.portList INNER JOIN
 dbo.site ON dbo.portList.siteCodeID = dbo.site.Site_ID
 where dbo.site.Site_ID = @siteId

--select * from #portAllocationDetail   
Select #portDetail.ddfId,#portDetail.portDetail,#portAllocationDetail.siteId,#portAllocationDetail.assigned_slot FROM #portDetail 
INNER JOIN #portAllocationDetail 
ON
#portDetail.siteId = #portAllocationDetail.siteId
END

【问题讨论】:

  • 如何确定返回表 B 中的哪些行?
  • 我写选择语句。一个仍然存在评论

标签: sql-server tsql


【解决方案1】:

inner join 为 TableA 中的每一行重复 TableB 中的每个匹配行。所以如果 TableA 有 4 行,TableB 有 7 行,则最大行数为 28。

Example at SQL Fiddle.

【讨论】:

  • 那么要么 TableA 包含超过 4 行,要么 TableB 包含超过 7 行。
  • 嗯好吧,我怎么能把它限制在四个
  • @shah,我们无法回答您的问题,因为我们必须知道第二个表中您想要保留哪些数据以及您不想保留哪些数据。您不想从该表中随机选择一个值,因此我们必须知道您希望我们向您展示如何应用什么业务规则。
【解决方案2】:

内连接返回满足条件的表的笛卡尔积的子集。 所以对于两个表 A 和 B 的行 n 和 m 以及条件 True,连接返回 nxm 行,这是最大值。

如果我们使用正确的术语,这个解释会多么简单,令人难以置信,但是我需要更多的时间来理解它“简单的方式”,这是大多数教程中解释的方式:(。

【讨论】:

    【解决方案3】:

    ---------inner join 表示-当两个表中至少有一个匹配时,INNER JOIN 关键字返回行。---------------- -

    【讨论】:

      【解决方案4】:

      内连接也会导致重复。

      如果您想要两个表中唯一的公共值,请使用 intersect 运算符。

      所以,这里的 intersect 如果两边都为空,甚至可以显示空值。

      【讨论】:

      • 如果可能的话,在带有问题上下文的示例中使用相交运算符
      • select * from portDetail pd,portAllocationDetail pad where pd.site_id = pad.site_id and pd.site_id in (select siteId from portDetail intersect select site_id from portAllocationDetail);
      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2018-10-29
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多