SQL基于多个表检索名称

SQL基于多个表检索名称,sql,database,oracle,Sql,Database,Oracle,所以我有三张桌子。客户(CustomerID,LastName,FirstName)、购买(PurchaseID,ItemName)和交易(CustomerID,PurchaseID,日期) 我遇到的问题是,我需要获得专门购买“油漆”和“书籍”这两种商品的客户的全名,但当我运行代码时,什么都没有出现。以下是我所拥有的: SELECT CUSTOMER.FirstName, CUSTOMER.LastName FROM CUSTOMER, PURCHASE WHERE PURCHASE.Item

所以我有三张桌子。客户(CustomerID,LastName,FirstName)、购买(PurchaseID,ItemName)和交易(CustomerIDPurchaseID,日期)

我遇到的问题是,我需要获得专门购买“油漆”和“书籍”这两种商品的客户的全名,但当我运行代码时,什么都没有出现。以下是我所拥有的:

SELECT CUSTOMER.FirstName, CUSTOMER.LastName
FROM CUSTOMER, PURCHASE
WHERE PURCHASE.Item = 'Paint' AND PURCHASE.Item = 'Books'
GROUP BY CUSTOMER.LastName, CUSTOMER.FirstName;
请帮帮我,我对这个很陌生,很想得到一些帮助。

没有连接

SELECT DISTINCT CUSTOMER.FirstName, CUSTOMER.LastName
FROM CUSTOMER A 
JOIN TRANSACTION B
ON A.CUSTOMERID=B.CUSTOMERID
JOIN PURCHASE C
ON B.PURCHASEID=C.PURCHASEID AND C.ITEM='Paint'
JOIN PURCHASE D 
ON B.PURCHASEID=D.PURCHASEID AND D.C.Item = 'Books'
没有联系

SELECT DISTINCT CUSTOMER.FirstName, CUSTOMER.LastName
FROM CUSTOMER A 
JOIN TRANSACTION B
ON A.CUSTOMERID=B.CUSTOMERID
JOIN PURCHASE C
ON B.PURCHASEID=C.PURCHASEID AND C.ITEM='Paint'
JOIN PURCHASE D 
ON B.PURCHASEID=D.PURCHASEID AND D.C.Item = 'Books'

这种类型的问题称为
关系划分

SELECT  CUSTOMER.FirstName, CUSTOMER.LastName
FROM    CUSTOMER    
        INNER JOIN TRANSACTION
            ON CUSTOMER.CustomerID = TRANSACTION.CustomerID
        INNER JOIN PURCHASE
            ON TRANSACTION.PurchaseID = PURCHASE.PurchaseID
WHERE   PURCHASE.Item IN ('Paint', 'Books')  -- list all items here
GROUP   BY CUSTOMER.LastName, CUSTOMER.FirstName
HAVING  COUNT(DISTINCT PURCHASE.Item) = 2 -- the total number of items searched
如果在每个事务上对每个
ItemName
强制执行了
唯一的
约束,则可以使用
*

SELECT  CUSTOMER.FirstName, CUSTOMER.LastName
FROM    CUSTOMER    
        INNER JOIN TRANSACTION
            ON CUSTOMER.CustomerID = TRANSACTION.CustomerID
        INNER JOIN PURCHASE
            ON TRANSACTION.PurchaseID = PURCHASE.PurchaseID
WHERE   PURCHASE.Item IN ('Paint', 'Books')
GROUP   BY CUSTOMER.LastName, CUSTOMER.FirstName
HAVING  COUNT(*) = 2

这种类型的问题称为
关系划分

SELECT  CUSTOMER.FirstName, CUSTOMER.LastName
FROM    CUSTOMER    
        INNER JOIN TRANSACTION
            ON CUSTOMER.CustomerID = TRANSACTION.CustomerID
        INNER JOIN PURCHASE
            ON TRANSACTION.PurchaseID = PURCHASE.PurchaseID
WHERE   PURCHASE.Item IN ('Paint', 'Books')  -- list all items here
GROUP   BY CUSTOMER.LastName, CUSTOMER.FirstName
HAVING  COUNT(DISTINCT PURCHASE.Item) = 2 -- the total number of items searched
如果在每个事务上对每个
ItemName
强制执行了
唯一的
约束,则可以使用
*

SELECT  CUSTOMER.FirstName, CUSTOMER.LastName
FROM    CUSTOMER    
        INNER JOIN TRANSACTION
            ON CUSTOMER.CustomerID = TRANSACTION.CustomerID
        INNER JOIN PURCHASE
            ON TRANSACTION.PurchaseID = PURCHASE.PurchaseID
WHERE   PURCHASE.Item IN ('Paint', 'Books')
GROUP   BY CUSTOMER.LastName, CUSTOMER.FirstName
HAVING  COUNT(*) = 2

您需要
联接
表。试一试

SELECT CUSTOMER.FirstName, CUSTOMER.LastName
FROM   CUSTOMER 
       INNER JOIN TRANSACTION ON TRANSACTION.CustomerID=CUSTOMER.CustomerID 
       INNER JOIN PURCHASE ON PURCHASE.PurchaseID=TRANSACTION.PurchaseID
WHERE PURCHASE.Item = 'Paint' OR PURCHASE.Item = 'Books'
GROUP BY CUSTOMER.LastName, CUSTOMER.FirstName
HAVING COUNT(DISTINCT PURCHASE.Item) >= 2;

您需要
联接
表。试一试

SELECT CUSTOMER.FirstName, CUSTOMER.LastName
FROM   CUSTOMER 
       INNER JOIN TRANSACTION ON TRANSACTION.CustomerID=CUSTOMER.CustomerID 
       INNER JOIN PURCHASE ON PURCHASE.PurchaseID=TRANSACTION.PurchaseID
WHERE PURCHASE.Item = 'Paint' OR PURCHASE.Item = 'Books'
GROUP BY CUSTOMER.LastName, CUSTOMER.FirstName
HAVING COUNT(DISTINCT PURCHASE.Item) >= 2;
这是伪代码。你们自己试试看


这是伪代码。你们自己试试看

请通过删除
分组依据
子句进行检查。请通过删除
分组依据
子句进行检查。不够灵活。当我想搜索5个项目时,请考虑这个查询。您需要再添加3个联接。@JW웃 是的,你说得对。这只是我的第一反应。你们都太快了……你们知道:)。不够灵活。当我想搜索5个项目时,请考虑这个查询。您需要再添加3个联接。@JW웃 是的,你说得对。这只是我的第一个反应。你们都太快了……你们知道:)。回答得很好。有趣的是,和我给的几乎一样:)但是你的更好+回答得好。有趣的是,和我给的几乎一样:)但是你的更好+1.