如何在SQL Server的“我的条件”中执行联接查询?

如何在SQL Server的“我的条件”中执行联接查询?,sql,join,stored-procedures,rdbms,outer-join,Sql,Join,Stored Procedures,Rdbms,Outer Join,我正在努力避免重复。有时它会显示重复的记录,我不明白我做错了什么。我对SQL进行了格式化,使其更具可读性。此外,顶部的case语句应该是coalesce或isnull,而不是case语句 我认为问题在于,JEDnineDays实际上并不包含返回的所有itemid,因此您的其他连接不会相互连接。您需要向join语句添加多个条件。。比如: on (JEDnineDays.itemid = MECnineDays.itemid OR JEDthirtyDays.itemid = MECnineDays

我正在努力避免重复。有时它会显示重复的记录,我不明白我做错了什么。

我对SQL进行了格式化,使其更具可读性。此外,顶部的case语句应该是coalesce或isnull,而不是case语句

我认为问题在于,JEDnineDays实际上并不包含返回的所有itemid,因此您的其他连接不会相互连接。您需要向join语句添加多个条件。。比如:

on (JEDnineDays.itemid = MECnineDays.itemid OR JEDthirtyDays.itemid = MECnineDays.itemid OR ... etc)
或者,也可能更好的做法是,先执行FROM Item表,然后连接其余的表。这将确保所有表都可以连接回现有项。一旦知道FROM子句中将包含所有itemid,如果需要,可以将所有完整的外部联接更改为左联接

固定SQL:

select 
    itemid
    ,convert(DECIMAL(10,2),JEDnineDays.NineDaysSold) JEDNineDaysSold
    ,convert(DECIMAL(10,2),MECnineDays.NineDaysSold) MECNineDaysSold
    ,convert(DECIMAL(10,2),JEDthirtyDays.ThirtyDaysSold) JEDThirtyDaysSold
    ,convert(DECIMAL(10,2),MECthirtyDays.ThirtyDaysSold) MECThirtyDaysSold
into #days
from Items i
full outer join (
    select itemid, sum(qtysold) as NineDaysSold
    from [JC_ItemDSP10days]
    where StoreID IN ('1201','1302','1400','1500')
    group by ItemID
) as JEDnineDays on(JEDnineDays.itemid = i.itemid)
full outer join (
    select itemid, sum(qtysold) as NineDaysSold
    from [JC_ItemDSP10days]
    where StoreID IN ('2001','2400','2200')
    group by ItemID
) as MECnineDays on(i.itemid = MECnineDays.itemid)
full outer join (
    select itemid, sum(qtysold) as ThirtyDaysSold
    from [JC_ItemDSP30Days]
    where StoreID IN ('1201','1302','1400','1500')
    group by ItemID
) as JEDthirtyDays on(i.itemid = JEDthirtyDays.itemid)
full outer join (
    select 
    itemid, sum(qtysold) as ThirtyDaysSold
    from [JC_ItemDSP30Days]
    where StoreID IN ('2001','2400','2200')
    group by ItemID
) as MECthirtyDays on(i.itemid = MECthirtyDays.itemid)

第一个子查询可能不会返回所有ItemID值。完全联接将把来自其他子查询的值放在不同的行中

以完整的列表开始您的查询,并将其余部分加入其中:

from    (
        select  distinct ItemID
        from    JC_ItemDSP10days
        ) all_items
full outer join
        (
        ) sub1
on      sub1.ItemID = all_items.ItemID

我同意它们看起来是重复的,但初始ItemId CASE语句表明相似/相同的值来自两个不同的表/视图:

具体而言:

MECnineDays.ItemID JEDthirtyDays.ItemID 另外,并不是说这是错误的,但是完整的外部联接用法看起来很可疑

怀疑您可能希望查看以下任一项或两项:

联合还是全体联合 分组依据,最小/最大/和 一旦你选择了天,这会产生预期的结果吗

select itemid,
Sum(IsNull(JEDNineDaysSold,0)) JEDNineDaysSold,
Sum(IsNull(MECNineDaysSold,0)) MECNineDaysSold,
Sum(IsNull(JEDThirtyDaysSold,0)) JEDThirtyDaysSold,
Sum(IsNull(MECThirtyDaysSold,0)) MECThirtyDaysSold
from #days
group by itemid
order by itemid

这是sql server吗?@joephillips毫无疑问。当然它是SQL Server JEDnineDays是否具有所有要返回的ItemID?否则,您的联接将不起作用properly@JoePhillips没有JEDnineDays没有所有itemid,表项有所有itemid。那么我应该如何加入Item Table正确的含义是什么?您所给出的只是一个错误的查询。我们无法读懂你的心思。请根据输入中的元组说明元组何时属于输出。为什么要使用完全外部联接?您知道它返回左外连接和右外连接的并集吗?您是否意识到外部联接返回内部联接行加上由null扩展的不匹配行?由于PK/UNIQUE和FK影响加入期望,您的DDL是什么?请阅读并执行。我对项目表执行了。但是它会返回很多记录。我预计会有近20k条记录,但它会返回所有项目记录,将近130000条记录。它提供的值不会重复。但它也会返回四列中的所有空值。这意味着它返回的项目id不存在于四个表jedninedays、MECnineDays、jedthirtyday、,MECthirtyDays@mohamed如果你改用左连接,我想它会解决这个问题。我同意完全外部连接是可疑的,但我不认为联合或分组是解决方案