【问题标题】:Selecting Columns from different tables using where in使用 where in 从不同的表中选择列
【发布时间】:2019-02-19 15:25:18
【问题描述】:

我正在尝试使用 Where-In 子句从不同表的列中检索数据,但无法这样做。要求的任务是:“列出所有过期产品的名称、包装重量、生产单位和批号”

数据库是这样的

create table Products(
    ProductId int,
    ProductName varchar(20) not null,
    PackageWeight float not null,
    PricePerUnit int not null,
    AmountInStore int,
    Primary Key(ProductId)
)

insert into Products values(1, 'Chicken Cutlet', 0.5, 500, 600)
insert into Products values(2, 'Chicken Cutlet', 0.25, 250, 0)
insert into Products values(3, 'Chicken Cutlet', 1, 1000, 500)
insert into Products values(4, 'Chicken Cutlet', 5, 4500, 600)
insert into Products values(5, 'Chicken Tenders', 300, 500, 500)
insert into Products values(6, 'Chicken Tenders', 600, 500, 100)
insert into Products values(7, 'Potato Fries', 1, 150, 0)
insert into Products values(8, 'Potato Fries', 5, 750, 800)

create table Production(
    ProductId int,
    BatchNo char(6) ,
    UnitsProduced int not null,
    DateOfProduction date not null,
    ExpiryDate date not null,
    Foreign Key(ProductId) references Products(ProductId),
    Primary Key(ProductId, BatchNo)
)

insert into Production values(1, '1-1001', 1000, '2014-01-01', '2014-01-10')
insert into Production values(2, '1-1001', 1000, '2014-01-01', '2014-01-10')
insert into Production values(3, '1-1001', 1000, '2014-02-01', '2014-02-10')
insert into Production values(4, '1-2001', 500, '2014-05-01', '2014-10-30')
insert into Production values(5, '1-2001', 500, '2014-05-10', '2030-11-10')

到目前为止,我有这个:

select ProductName, PackageWeight from Products where ProductId in(
select ProductId from Products
Intersect
select ProductId from Production where ExpiryDate < GETDATE())

我得到了正确的产品名称和包装重量,因为它们都来自同一个表,即产品,但我如何才能从不同的表中检索 BatchNoUnitsProduced,即同一查询中的生产?

【问题讨论】:

  • 预期输出?

标签: sql-server


【解决方案1】:

我会简单地使用JOIN:

SELECT P.ProductName, P.PackageWeight, PD.BatchNo, PD.UnitsProduced
FROM Products P
JOIN Production PD ON P.ProductId = PD.ProductId
WHERE ExpiryDate < CONVERT(DATE,GETDATE()) 

【讨论】:

    【解决方案2】:

    你需要join基于ProductId的表,试试下面的查询。

    如果你想修改你现有的查询,它应该是这样的。

    SELECT productname, 
           packageweight, 
           prdn.batchno, 
           prdn.unitsproduced 
    FROM   products prd 
           INNER JOIN production prdn 
                   ON prd.productid = prdn.productid 
    WHERE  prd.productid IN(SELECT productid 
                            FROM   products 
                            INTERSECT 
                            SELECT productid 
                            FROM   production 
                            WHERE  expirydate < Getdate()) 
    

    但如果你愿意,你可以像下面这样重构你的查询。

    SELECT productname, 
           packageweight, 
           prdn.batchno, 
           prdn.unitsproduced 
    FROM   products prd 
           INNER JOIN production prdn 
                   ON prd.productid = prdn.productid 
    WHERE  expirydate < Getdate() 
    

    【讨论】:

      【解决方案3】:

      您可以使用sql server views 轻松实现此目的。 您可以这样做:

      创建视图

      -- Note that Table Alias is Used For Query Clarity
      -- 'P' => For Product Table
      -- 'Pr' => For Production Table
      CREATE VIEW viewName
      AS
      SELECT P.ProductId AS ID,
             P.ProductName AS Name,
             P.PackageWeight,
             P.PricePerUnit,
             P.AmountInStore,
             Pr.BatchNo,
             Pr.ExpiryDate,
             Pr.UnitsProduced,
             Pr.DateOfProduction
      FROM Production AS Pr
      INNER JOIN
      Products AS P
      ON Pr.ProductId = P.ProductId;
      

      获取结果如下

      SELECT Name,
         PackageWeight,
         BatchNo,
         UnitsProduced
      FROM viewName
      WHERE ExpiryDate < GETDATE();
      

      【讨论】:

        猜你喜欢
        • 2015-02-28
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2022-11-17
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多