【问题标题】:Alias for the results of the INNER JOIN and for both tables that are being joined at the same timeINNER JOIN 结果的别名以及同时连接的两个表的别名
【发布时间】:2021-01-29 10:04:27
【问题描述】:
USE [MasterDB]

GO
CREATE proc  dbo.ProductPropertiesInsert
AS
SET NOCOUNT ON;

INSERT INTO [MasterDB].[Main].[Property]
SELECT vp.Product_ID, vp.Property_ID
FROM ( SELECT * FROM [MasterDB].[Product].[Report] vr INNER JOIN [MasterDB].[Main].[Product] jt ON vr.vin=v.VIN )
     cross apply (values (208, jt.id, jt.IsExclusive), 
                         (209, jt.id, jt.IsNew),
                         (213, jt.id, jt.IsPremium)) 
                         vp(Property_ID, Product_ID, property)
WHERE vp.property=1
      /* optional code? */
      and not exists(select 1 
                     from [HGregoireCentral].[Main].[Property] p_in
                     where vp.id=p_in.id
                           and vp.Property_ID=p.Property_ID);
GO

我有这个存储过程,但我想知道 jt 的别名是内部联接的别名还是 [MasterDB].[Main].[Product] 的别名。

我在 vr.vin=v.VIN 上加入它,v 代表 [MasterDB].[Main].[Product],但是因为 v 没有定义,我需要交叉应用语句的内部连接,我不知道如何正确地做到这一点。到目前为止,我认为该语句行不通,因为我需要内部联接的结果和表 [MasterDB].[Main].[Product] 的别名。

你是怎么做到的?

报告表

vin isNew isExclusive isPremium 
11   1       1          0  
12   0       0          1 
13   1       0          1 

主表(用于获取属性表的属性id)

vin id 
11  10 
12  11 
13  12 

属性表(我需要为第一个表中的每个 propertyId 插入行)

id propertyId 
10 1 
10 2 
11 3 
12 1 
12 3

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 您的问题是什么? PS你是什么意思,“别名”?你的意思是,jt 是评估内部连接的结果还是只是它的正确参数?后者。但是为什么会是前者,为什么不是后者呢?如果你不给出你的推理,我们就找不到你的误解,你只是要求重写一个介绍/手册,这太宽泛了,而且是重复的。但是,如果这是您的问题,请研究并提出问题,不要提供所有这些代码。并在你的总体目标之前询问意想不到的结果。你在这里混合一堆问题,问一个特定的研究过的非重复问题。

标签: sql-server sql-server-2008 subquery inner-join sql-insert


【解决方案1】:

我不确定您的查询是否是有效的 SQL Server 代码:

  • from 子句中的子查询不是别名

  • jt 在子查询中定义,不应在外部查询中可用。

但基本上,我认为您根本不需要那个子查询。您可以将连接展平,例如:

INSERT INTO [MasterDB].[Main].[Property]
SELECT vp.Product_ID, vp.Property_ID
FROM [MasterDB].[Product].[Report] vr 
INNER JOIN [MasterDB].[Main].[Product] jt ON jt.vin = vr.VIN
CROSS APPLY (VALUES 
    (208, jt.id, jt.IsExclusive), 
    (209, jt.id, jt.IsNew),
    (213, jt.id, jt.IsPremium)
) vp(Property_ID, Product_ID, property)
WHERE 
    vp.property=1
    AND NOT EXISTS (
        SELECT 1 
        FROM [HGregoireCentral].[Main].[Property] p_in
        WHERE vp.id = p_in.id AND vp.Property_ID = p_in.Property_ID
    )

请注意,我还在NOT EXISTS 子查询中修复了不正确的表别名p - 大概,您的意思是p_injoin 中的别名 v 也是如此。

【讨论】:

  • v 是从哪里来的?
  • @deliguy:是的,很好,我没有在你的查询中发现这个。我也(试图)解决这个问题。
  • 另外,为什么你认为我发布的代码不是有效的 mssql 代码?您是说您认为您发布的代码不会运行,因为我没有看到很多差异。
  • @deliguy:答案中解释了为什么我对您的代码持怀疑态度,以及修改代码的理由。
猜你喜欢
  • 2012-05-30
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多