【问题标题】:SQL nested Inner Joins? Or Where Clause On Inner Joins?SQL嵌套内连接?或者内连接子句在哪里?
【发布时间】:2016-05-25 21:57:12
【问题描述】:

我在尝试编写的查询时遇到问题。不幸的是,我只能查询数据库而不能更改架构。以下是一些简化的示例表:

Table 1
itemID          sale date
----------------------------
1                 1/2015
1                 3/2016
2                 5/2016
2                 1/2015

Table 2
itemID           colorID           price
--------------------------------------
1                 1                23
1                 2                10
1                 3                13
2                 1                11
2                 2                14
2                 3                18

Table 3
ColorID       color
---------------------------------------
 1             Red
 2             Blue
 3             Green

Table 4
SaleBegin       SaleEnd      ColorID
----------------------------------------
1/1/2014        12/31/2014      1
1/1/2015        12/31/2015      2
1/1/2016        12/31/2016      3

现在我需要一个查询来获取第一个表中两个项目 ID 的价格和颜色。我不确定如何使用这个模式来做到这一点,即使只是为了一个。我试过类似的东西:

SELECT item_id, price, color FROM Table1 T1

INNER JOIN Table2 T2
ON T1.ItemID=T2.ItemID

INNER JOIN Table3 T3
ON T2.ColorID=T3.ColorID

INNER JOIN  Table4 T4
ON T3.ColorID=T4.ColorID

WHERE T1.itemID between SaleBegin AND SaleEnd

但这对我不起作用,而是为我提供每件商品的所有可能颜色和价格。我究竟做错了什么?我如何获得这些值?预期结果应如下所示:

    itemID     color      price  
------------------------------------
    1           Blue        10
    1           Green       13
    2           Green       18
    2           Blue        14

【问题讨论】:

  • 不应该是WHERE T1.SaleDate between SaleBegin AND SaleEnd吗?
  • 您是否要在每次销售期间查找每件商品的价格和颜色?

标签: sql sql-server join


【解决方案1】:

http://sqlfiddle.com/#!9/e6fac/4

SELECT t1.itemID
     , t3.color
     , t2.price
  FROM table_1 t1
  LEFT JOIN table_2 t2
    ON t1.itemID = t2.itemID
  LEFT JOIN table_3 t3
    ON t2.colorID = t3.colorID
  LEFT JOIN table_4 t4
    ON t3.colorID = t4.colorID
  WHERE t1.sale_date BETWEEN saleBegin and saleEnd;

【讨论】:

  • 你好奥利,谢谢你的回答!我遇到了一个问题。如果 itemID 上有一个空值(让我们假设他们知道某件商品已售出,但不知道是什么,但仍有销售日期),则它不会返回。即使使用所有空值,我怎样才能让它返回?
【解决方案2】:

我不确定这是否是您要查找的内容,但此查询会在每次销售期间为您提供每种产品的 itemID、颜色和价格

SELECT
   t4.SaleBegin
  ,t4.SaleEnd
  ,t1.itemID
  ,t3.color
  ,t2.price
FROM Table4 t4
INNER JOIN Table1 t1
  ON t4.SaleBegin = CAST(REPLACE(t1.[sale date], '/', '/1/') AS DATE)
INNER JOIN Table2 t2
  ON t1.itemID = t2.itemID
  AND t4.ColorID = t2.ColorID
INNER JOIN Table3 t3
  ON t4.ColorID = t3.colorID

这里是SQL Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2023-03-11
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2023-02-25
    相关资源
    最近更新 更多