SQL检索基于多个表的名称

blo*_*m17 0 sql database oracle

所以我有三张桌子.CUSTOMER(CustomerID,LastName,FirstName),PURCHASE(PurchaseID,ItemName)和TRANSACTION(CustomerID,PurchaseID,Date).

我遇到的问题是我需要获得专门购买"Paint"和"Books"两个项目的客户的全名,但是当我运行我的代码时,没有任何问题出现.这是我有的:

SELECT CUSTOMER.FirstName, CUSTOMER.LastName
FROM CUSTOMER, PURCHASE
WHERE PURCHASE.Item = 'Paint' AND PURCHASE.Item = 'Books'
GROUP BY CUSTOMER.LastName, CUSTOMER.FirstName;
Run Code Online (Sandbox Code Playgroud)

请帮助,我真的很新,我真的很想得到一些帮助.

Joh*_*Woo 5

这种类型的问题被称为Relational Division.

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
Run Code Online (Sandbox Code Playgroud)

如果每个事务UNIQUE都有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
Run Code Online (Sandbox Code Playgroud)