【问题标题】:Compare subquery results比较子查询结果
【发布时间】:2014-07-16 16:20:37
【问题描述】:

我不知道下一步该做什么。我需要编写一个查询,告诉我位于特定城市的供应商是否都运送公共部件。我创建了以下查询

select sh1.partno,sh1.supplierno
from shipments sh1 
where sh1.supplierno IN (
  select s.supplierno
  from suppliers s
  where s.city = 'LONDON')

返回

partno  supplierno
  P1    S1
  P1    S1
  P3    S1
  P3    S1
  P3    S1
  P6    S4
  P2    S4
  P5    S4
  P5    S4

我不知道下一步该做什么。以下是指定城市供应商发货的所有零件。您如何比较这两列,以便您想知道供应商编号列中列出的两个不同供应商编号是否运送了一个共同的零件编号。我知道这不会有结果,但我仍然需要知道如何前进。

提前致谢

【问题讨论】:

  • 你想要的结果是什么?!
  • 您需要的语法是GROUP BY .. HAVING。这是作业吗?
  • 可能是这样的? stackoverflow.com/questions/8149210/… 在您的情况下,您将选择 s.city, t.* from [shipments] s join ( select partno, supplierno, count() as qty from [shipments] group by partno, supplierno 有 count( i>) > 1 ) t on s.partno = t.partno 和 s.supplierno= t.supplierno
  • 是的,这是一个家庭作业。我尝试过 group by,但这不只是告诉我其中一个供应商多次运送了一个零件,而不是他们与另一个供应商运送了相同的零件吗?
  • 我可能应该补充一点,在这种情况下,供应商城市名称 london 是与同时列出供应商编号和零件编号的发货的单独表格。这就是为什么我有用于查找供应商编号的子查询。

标签: sql


【解决方案1】:

自加入可能是您想要的。

select yourfields
from shipments sh1 join shipments sh2 on sh1.partno = sh2.partno
and sh1.supplierid <> sh2.supplierid
etc

编辑

没有连接关键字的相同查询

select yourfields
from shipments sh1, shipments sh2 
where sh1.partno = sh2.partno
and sh1.supplierid <> sh2.supplierid
etc

【讨论】:

  • 谢谢我们不允许使用join关键字不幸。
  • 导师非常坚持我们不使用任何考虑或类似笛卡尔积的东西
  • 好的,我从你的编辑中得到了那部分。最后一部分是弄清楚如何从不同的表中设置供应商编号并将其插入供应商 ID。供应商 City = "LONDON' 我想我的问题是如何让 sh1.supplierid 和 sh2.supplierid 成为另一个表中的值?
  • 你应该把它作为一个单独的问题。这个太老了,不会让更多人看到它。当您发布它时,为您正在使用的数据库引擎添加一个标签。它可能会增加潜在回答者的数量,并会阻止人们向您询问。此外,请立即提及这是一项学术活动,并包括您受到的所有限制。这将增加您获得好答案的可能性。
【解决方案2】:

如果您从供应商和零件的基本列表开始(按城市过滤),您的初始查询将是:

SELECT sh1.partno,sh1.supplierno
FROM 
    shipments sh1 
     INNER JOIN 
    suppliers s ON 
        sh1.supplierno = s.supplierno
WHERE s.city = 'LONDON'

这将为您提供供应商和零件的列表。不能使用 JOIN 反而会限制你——我不会真正考虑适当过滤的自加入笛卡尔积,但是,嘿,这是他的课。

如果需要,您可以使用 GROUP BY 和 HAVING 子句仅获取部分列表,例如:

SELECT sh1.partno, COUNT(DISTINCT sh1.supplierno) AS NumberOfSuppliers
FROM 
    shipments sh1 
     INNER JOIN 
    suppliers s ON 
        sh1.supplierno = s.supplierno
WHERE s.city = 'LONDON'
GROUP BY sh1.partno
HAVING MIN(sh1.supplierno) <> MAX(sh1.supplierno)

另一方面,如果您正在寻找零件和供应商,则需要将您的供应商列表条款与另一个供应商和零件列表结合起来。 JOIN 是最有意义的,但如果这是禁区,则 EXISTS 关键字可能会对您有所帮助 - 类似以下内容可能确实希望您正在寻找(如果这是否正确,我不记得了,所以让我知道它是否有效)。

SELECT sh1.partno, sh1.supplierno
FROM 
    shipments sh1 
     INNER JOIN 
    suppliers s ON 
        sh1.supplierno = s.supplierno
WHERE 
    s.city = 'LONDON' AND
    EXISTS 
      (
        SELECT sh2.supplierno
        FROM 
            shipments sh2
             INNER JOIN 
            suppliers s2 ON 
                sh2.supplierno = s2.supplierno
        WHERE 
            s2.City = 'LONDON' AND 
            sh2.supplierno != sh1.supplierno AND
            sh2.partno = sh1.partno
      )

不过,我会推荐 @Dan Bracuk 建议的自加入,而不是其中任何一个。

【讨论】:

  • 谢谢,根据我读过的所有内容,我会很好,在这种情况下,我受限于讲师提供的内容。谢谢
【解决方案3】:

伦敦的供应商数量:

select count(distinct s.supplierno)
from suppliers s
where s.city = 'LONDON'

每个partno在伦敦的供应商数量:

select sh1.partno, count(distinct sh1.supplierno)
from shipments sh1 
where sh1.supplierno IN (
    select s.supplierno
    from suppliers s
    where s.city = 'LONDON'
)
group by sh1.partno

哪个partno 在伦敦的供应商数量与伦敦的供应商数量一样多?提示,拥有将简化剩下的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多