J'essaie de récupérer des données à partir de colonnes de différentes tables en utilisant la clause Where-In mais je ne parviens pas à le faire. La tâche requise est: "Lister le nom, le poids de l'emballage et les unités produites et le nombre de lots de tous les produits expirés"
La base de données ressemble à ceci
select ProductName, PackageWeight from Products where ProductId in( select ProductId from Products Intersect select ProductId from Production where ExpiryDate < GETDATE())
Jusqu'à présent J'ai ceci:
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')
J'obtiens le nom du produit et le poids du colis corrects car ils proviennent tous les deux du même tableau, c'est-à-dire Produits, mais comment puis-je également récupérer LotNo , UnitsProduced à partir d'une table différente ie Production dans la même requête?
3 Réponses :
Vous devez joindre les tables basées sur ProductId , essayez comme la requête suivante.
Si vous souhaitez modifier votre requête existante, cela devrait ressembler à.
SELECT productname,
packageweight,
prdn.batchno,
prdn.unitsproduced
FROM products prd
INNER JOIN production prdn
ON prd.productid = prdn.productid
WHERE expirydate < Getdate()
Mais si vous le souhaitez, vous pouvez re-factoriser votre requête comme suit.
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())
J'utiliserais simplement 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())
Vous pouvez facilement y parvenir en utilisant les vues de serveur SQL .
Voici comment procéder:
Créer une vue
SELECT Name, PackageWeight, BatchNo, UnitsProduced FROM viewName WHERE ExpiryDate < GETDATE();
Obtenir les résultats comme suit strong >
-- 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;
Production attendue?