SQL Server JOINS

时间:2014-08-22 13:38:46

标签: sql sql-server

有人可以帮我解释一下,当我在表A中有12行,在B中有10行时我会做一个内连接,我会得到比

更多的行

在A和B中?

与左右连接相同......

这只是一个简化的例子。让我与您分享我的一个问题

我有2个观点;这是最初在2个基础表文化和试验中的SQL。

然后,当尝试添加另一个表文化步骤时,其中一个团队成员将SQL分成两个视图

由于这会在更新时产生错误(因为它影响多个基表而无法进行修改),我想得到

回到更改SQL,以便我不再使用视图,但实现相同的结果。

其中一个观点有

SELECT       some columns
FROM            dbo.Culture RIGHT JOIN
                     dbo.Trial ON dbo.Culture.cultureID = dbo.Trial.CultureID LEFT         OUTER JOIN
                     dbo.TrialCultureSteps_view_part1 ON dbo.Culture.cultureID =     dbo.TrialCultureSteps_view_part1.cultureID

其他TrialCultureSteps_view_part1视图

  SELECT DISTINCT dbo.Culture.cultureID,
 (SELECT        TOP (1) WeekNr
  FROM            dbo.CultureStep
  WHERE        (CultureID = dbo.Culture.cultureID)
  ORDER BY CultureStepID) AS normalstartweek
  FROM            dbo.Culture INNER JOIN
  dbo.CultureStep AS CultureStep_1 ON dbo.Culture.cultureID = CultureStep_1.CultureID

那么我如何组合连接只使用SQL而不需要视图来实现相同的结果呢?

2 个答案:

答案 0 :(得分:0)

评论解释了JOIN问题。至于重写,任何观点都可以用CTE代替。 另一种重写查询的方法是:(虽然有样本数据和预期结果会更容易确认它是否正确)

;with TrialCultureSteps_view_part1 AS
(
Select Row_number() OVER (Partition BY CultureID ORDER BY CultureStepID) RowNumber
, WeekNr
, CultureID
) 
SELECT       some columns
dbo.trial LEFT OUTER JOIN
dbo.Culture ON dbo.Culture.cultureID = dbo.Trial.CultureID LEFT OUTER JOIN
TrialCultureSteps_view_part1 ON dbo.Culture.cultureID =     dbo.TrialCultureSteps_view_part1.cultureID and RowNumber=1

访问代码,我对语法不太熟悉,但我知道Row_Number()不可用,我也不相信它有CTE语法。因此,我们需要添加一些嵌套的派生表。

   SELECT       some columns
    dbo.trial LEFT OUTER JOIN
    dbo.Culture ON dbo.Culture.cultureID = dbo.Trial.CultureID LEFT OUTER JOIN
    (  Select cs.CultureID, cs.WeekNr FROM 
            (     SELECT CultureID, MIN(CultureStepID) CultureStepID
                  FROM   dbo.CultureStep
                  GROUP BY CultureID
            ) Fcs INNER JOIN 
          CultureStep cs ON fcs.cultureStepID=cs.CultureStepID 
    ) TrialCultureSteps_view_part1 ON dbo.Culture.cultureID =     TrialCultureSteps_view_part1.cultureID 

这里的假设是CultureStepID是CultureStep的PK。不要假设每个Culture条目必须存在一个步骤。

答案 1 :(得分:0)

欢迎使用StackOverflow! This link可能是您理解JOIN的好地方。从本质上讲,您描述的“问题”归结为这样一个事实,即您的一个或多个来源(Trial,Culture或TrialCultureSteps视图)每个CultureID有多个记录 - 换句话说,相同的CultureID(#1)显示多行。

仅基于该ID,我将执行以下三个查询。他们返回的任何内容都是重复的“原因” - 文化ID不止一次出现,所以你不仅要加入文化ID而且还要加入。如果我怀疑,您的视图是具有多个文化ID的视图,则需要将其修改为仅返回一条记录,或者更改您加入的方式。

SELECT *
FROM Trial
WHERE CultureID IN 
  (
    SELECT CultureID
    FROM Trial 
    GROUP BY CultureID
    HAVING COUNT(*) > 1
  )
ORDER BY CultureID 

SELECT *
FROM Culture
WHERE CultureID IN 
  (
    SELECT CultureID
    FROM Culture 
    GROUP BY CultureID
    HAVING COUNT(*) > 1
  )
ORDER BY CultureID 


SELECT *
FROM TrialCultureSteps_view_part1
WHERE CultureID IN 
  (
    SELECT CultureID
    FROM TrialCultureSteps_view_part1 
    GROUP BY CultureID
    HAVING COUNT(*) > 1
  )
ORDER BY CultureID 

如果有任何返回值,请告诉我们。