有人可以帮我解释一下,当我在表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而不需要视图来实现相同的结果呢?
答案 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
如果有任何返回值,请告诉我们。