SQL嵌套选择与联接

SQL嵌套选择与联接,sql,sql-server,Sql,Sql Server,我浪费了一整天的时间在一个查询上,但是没有成功,所以我需要一个帮助:)有了一个给定的@CustomerId,我需要查询所有链接到客户卖家可以销售但以前没有销售给他的产品,佣金表指示卖家可以销售什么产品 提前谢谢这样行吗 SELECT sell.*, prod.* FROM Sellers sell INNER JOIN Customers cust ON cust.SellerId = sell.SellerId LEFT JOIN Commissions comm ON sell.Sell

我浪费了一整天的时间在一个查询上,但是没有成功,所以我需要一个帮助:)有了一个给定的@CustomerId,我需要查询所有链接到客户卖家可以销售但以前没有销售给他的产品,佣金表指示卖家可以销售什么产品

提前谢谢

这样行吗

SELECT sell.*, prod.* FROM 
Sellers sell
INNER JOIN Customers cust ON cust.SellerId = sell.SellerId
LEFT JOIN Commissions comm ON sell.SellerId = comm.SellerId
LEFT JOIN Products prod ON prod.ProductId = comm.ProductId
WHERE prod.ProductId NOT IN (
SELECT ProductId
FROM Products p INNER JOIN 
Sales s ON s.ProductId = p.ProductId
WHERE s.CustomerId = @CustomerId
它从佣金中获得所有卖家和相应的产品,其中产品Id与客户的任何销售都不相关

这样行吗

SELECT sell.*, prod.* FROM 
Sellers sell
INNER JOIN Customers cust ON cust.SellerId = sell.SellerId
LEFT JOIN Commissions comm ON sell.SellerId = comm.SellerId
LEFT JOIN Products prod ON prod.ProductId = comm.ProductId
WHERE prod.ProductId NOT IN (
SELECT ProductId
FROM Products p INNER JOIN 
Sales s ON s.ProductId = p.ProductId
WHERE s.CustomerId = @CustomerId
它从佣金中获得所有卖家和相应的产品,其中产品Id与客户的任何销售都不相关

这样行吗

SELECT sell.*, prod.* FROM 
Sellers sell
INNER JOIN Customers cust ON cust.SellerId = sell.SellerId
LEFT JOIN Commissions comm ON sell.SellerId = comm.SellerId
LEFT JOIN Products prod ON prod.ProductId = comm.ProductId
WHERE prod.ProductId NOT IN (
SELECT ProductId
FROM Products p INNER JOIN 
Sales s ON s.ProductId = p.ProductId
WHERE s.CustomerId = @CustomerId
它从佣金中获得所有卖家和相应的产品,其中产品Id与客户的任何销售都不相关

这样行吗

SELECT sell.*, prod.* FROM 
Sellers sell
INNER JOIN Customers cust ON cust.SellerId = sell.SellerId
LEFT JOIN Commissions comm ON sell.SellerId = comm.SellerId
LEFT JOIN Products prod ON prod.ProductId = comm.ProductId
WHERE prod.ProductId NOT IN (
SELECT ProductId
FROM Products p INNER JOIN 
Sales s ON s.ProductId = p.ProductId
WHERE s.CustomerId = @CustomerId

它从佣金中获取所有卖家和相应的产品,其中产品Id与客户的任何销售都不相关

基本上,您要查找的产品在
佣金中有记录,但在
销售中没有记录
。使用
:id
表示特定id:

SELECT *
FROM   products
WHERE  productid IN (SELECT productid
                     FROM   commissions
                     WHERE  sellerid = :id) AND
       productid NOT IN (SELECT productid
                         FROM   sales
                         JOIN   customers ON sales.customerid = cusomers.customerid
                         WHERE  sellerid = :id)

基本上,您要寻找的产品在
佣金
中有记录,但在
销售
中没有记录。使用
:id
表示特定id:

SELECT *
FROM   products
WHERE  productid IN (SELECT productid
                     FROM   commissions
                     WHERE  sellerid = :id) AND
       productid NOT IN (SELECT productid
                         FROM   sales
                         JOIN   customers ON sales.customerid = cusomers.customerid
                         WHERE  sellerid = :id)

基本上,您要寻找的产品在
佣金
中有记录,但在
销售
中没有记录。使用
:id
表示特定id:

SELECT *
FROM   products
WHERE  productid IN (SELECT productid
                     FROM   commissions
                     WHERE  sellerid = :id) AND
       productid NOT IN (SELECT productid
                         FROM   sales
                         JOIN   customers ON sales.customerid = cusomers.customerid
                         WHERE  sellerid = :id)

基本上,您要寻找的产品在
佣金
中有记录,但在
销售
中没有记录。使用
:id
表示特定id:

SELECT *
FROM   products
WHERE  productid IN (SELECT productid
                     FROM   commissions
                     WHERE  sellerid = :id) AND
       productid NOT IN (SELECT productid
                         FROM   sales
                         JOIN   customers ON sales.customerid = cusomers.customerid
                         WHERE  sellerid = :id)
这样可以避免在语句中耗费时间

如果客户只能有一个卖家,则可以省略卖家链接:

SELECT sellableProduct
FROM (SELECT Comissions.ProductId AS sellableProduct FROM Comissions INNER JOIN Sellers ON Comissions.SellerId=Sellers.SellerId INNER JOIN Customers ON Sellers.SellerId=Customers.SellerId WHERE Customers.CustomerId = @customerid) AS tblSellable
LEFT JOIN (SELECT Sales.ProductId AS soldProduct FROM Sales WHERE Sales.CustomerId = @customerid) AS tblSold
ON tblSellable.sellableProduct=tblSold.soldProduct
WHERE tblSold.soldProduct IS NULL
这样可以避免在语句中耗费时间

如果客户只能有一个卖家,则可以省略卖家链接:

SELECT sellableProduct
FROM (SELECT Comissions.ProductId AS sellableProduct FROM Comissions INNER JOIN Sellers ON Comissions.SellerId=Sellers.SellerId INNER JOIN Customers ON Sellers.SellerId=Customers.SellerId WHERE Customers.CustomerId = @customerid) AS tblSellable
LEFT JOIN (SELECT Sales.ProductId AS soldProduct FROM Sales WHERE Sales.CustomerId = @customerid) AS tblSold
ON tblSellable.sellableProduct=tblSold.soldProduct
WHERE tblSold.soldProduct IS NULL
这样可以避免在语句中耗费时间

如果客户只能有一个卖家,则可以省略卖家链接:

SELECT sellableProduct
FROM (SELECT Comissions.ProductId AS sellableProduct FROM Comissions INNER JOIN Sellers ON Comissions.SellerId=Sellers.SellerId INNER JOIN Customers ON Sellers.SellerId=Customers.SellerId WHERE Customers.CustomerId = @customerid) AS tblSellable
LEFT JOIN (SELECT Sales.ProductId AS soldProduct FROM Sales WHERE Sales.CustomerId = @customerid) AS tblSold
ON tblSellable.sellableProduct=tblSold.soldProduct
WHERE tblSold.soldProduct IS NULL
这样可以避免在语句中耗费时间

如果客户只能有一个卖家,则可以省略卖家链接:

SELECT sellableProduct
FROM (SELECT Comissions.ProductId AS sellableProduct FROM Comissions INNER JOIN Sellers ON Comissions.SellerId=Sellers.SellerId INNER JOIN Customers ON Sellers.SellerId=Customers.SellerId WHERE Customers.CustomerId = @customerid) AS tblSellable
LEFT JOIN (SELECT Sales.ProductId AS soldProduct FROM Sales WHERE Sales.CustomerId = @customerid) AS tblSold
ON tblSellable.sellableProduct=tblSold.soldProduct
WHERE tblSold.soldProduct IS NULL


你如何知道卖家可以销售哪些产品?也许是通过佣金表?我可以用SellerId@DimaRudaev:您正在通过
销售
表连接
客户
产品
?如何确定产品是否被卖掉?一个“产品”表名是不好的选择,你可以认为它像“类别”,每个销售表中的记录表明一个销售,客户只能购买每一个产品的1。你知道卖家可以卖哪些产品吗?也许是通过佣金表?我可以用SellerId@DimaRudaev:您正在通过
销售
表连接
客户
产品
?如何确定产品是否被卖掉?一个“产品”表名是不好的选择,你可以认为它像“类别”,每个销售表中的记录表明一个销售,客户只能购买每一个产品的1。你知道卖家可以卖哪些产品吗?也许是通过佣金表?我可以用SellerId@DimaRudaev:您正在通过
销售
表连接
客户
产品
?如何确定产品是否被卖掉?一个“产品”表名是不好的选择,你可以认为它像“类别”,每个销售表中的记录表明一个销售,客户只能购买每一个产品的1。你知道卖家可以卖哪些产品吗?也许是通过佣金表?我可以用SellerId@DimaRudaev:您正在通过
销售
表连接
客户
产品
?一个“产品”表名是一个坏的选择,你可以认为它是“类别”,每个销售表中的记录表明一个销售,客户只能购买1的每一个产品。你的意思是我需要查询关联的SellerId给给定的客户,然后运行你的查询:ID=SellerId?“Sale. SaleID”sales Tablearg中没有sellerid字段,未引起注意。修正。请让我理解,您告诉我通过SellerId查询,我可以使用@CustomerId从客户表中查询它??您的查询回答了问题“卖家可以销售哪些产品以前没有销售过”以及我需要回答问题“卖家可以销售哪些产品以前没有销售给特定客户@CustomerId”,无论如何,谢谢您的意思是我需要查询与给定客户关联的SellerId,然后使用:id=SellerId?“sales.SellerId”运行您的查询sales Tablearg中没有SellerId字段,我没有注意。修正。请让我理解,您告诉我通过SellerId查询,我可以使用@CustomerId从客户表中查询它??您的查询回答了问题“卖家可以销售哪些产品以前没有销售过”以及我需要回答问题“卖家可以销售哪些产品以前没有销售给特定客户@CustomerId”,无论如何,谢谢您的意思是我需要查询与给定客户关联的SellerId,然后使用:id=SellerId?“sales.SellerId”运行您的查询sales Tablearg中没有SellerId字段,我没有注意。修正。请让我理解,您告诉我通过SellerId查询,我可以使用@CustomerId从客户表中查询它??您的查询回答了问题“卖家可以销售哪些产品以前没有销售过”以及我需要回答问题“卖家可以销售哪些产品以前没有销售给特定客户@CustomerId”,无论如何,谢谢您的意思是我需要查询与给定客户关联的SellerId,然后使用:id=SellerId?“sales.SellerId”运行您的查询sales Tablearg中没有SellerId字段,我没有注意。修好了,让我来