【问题标题】:Looking for help on joining query寻求加入查询的帮助
【发布时间】:2014-02-24 14:53:56
【问题描述】:

我正在参加我的第一个编程 (sql) 课程。我没有任何技术背景,并且在获取代码时遇到了一些麻烦。 这是数据库的样子。

  BOOK_CODE (UNIQUE)
  BOOKTITLE
  PUBLISHER_CODE
  BOOKTYPE
  PRICE

库存

 BOOK_CODE (UNIQUE)
 BRANCH_NUM (UNIQUE)
 ON_HAND

  

问题是,列出分支 3 和分支 4 中可用的书籍(标题)(同时在两个分支上)。

我想我需要使用以下表格:book 表上的 booktitle,两个表(book 和 inventory)上的 bookcode,以及 inventory 表上的 branch_num。

而且答案只能显示分支 3 和分支 4(同时)上可用的书名,而不能显示其他列。

对不起,如果我没有任何意义。就像我说的那样,我是一个 n00b。

【问题讨论】:

  • 只是为了确保,当您说“...显示分支 3 和 4 上可用的书名...”时,您的意思是 ON_HAND 字段必须大于 0 吗?

标签: mysql sql tsql inner-join


【解决方案1】:
 select distinct BOOKTITLE from BOOK a, INVENTORY b
      where a.BOOK_CODE = b.BOOK_CODE and a.BOOK_CODE in 
    (select distinct p.BOOK_CODE from Inventory p, Inventory q where p.BOOK_CODE = 
    q.BOOK_CODE 
    and p.BRANCH_NUM = 3 AND q.BRANCH_NUM = 4);

【讨论】:

  • 您需要在 BOOKTITLE 前加上 a
  • 这将为您提供分支 3 或 4 中的所有书籍。不一定两者兼而有之。
  • 啊!没有注意到他需要它在两者中。我会修改它。
  • 这就是我正在做的,但它给了我错误的答案,我想我知道为什么了。还是谢谢!
【解决方案2】:
SELECT BOOKTITLE FROM BOOK
WHERE BOOK_CODE IN (SELECT BOOK_CODE FROM INVENTORY WHERE BRANCH_NUM = 3 AND ON_HAND > 0)
    AND BOOK_CODE IN (SELECT BOOK_CODE FROM INVENTORY WHERE BRANCH_NUM = 4 AND ON_HAND > 0);

SELECT BOOKTITLE FROM
(
    SELECT BOOK.BOOK_CODE, BOOKTITLE, COUNT(*) AS BRANCH_COUNT FROM BOOK
    INNER JOIN INVENTORY ON BOOK.BOOK_CODE = INVENTORY.BOOK_CODE
        AND INVENTORY.BRANCH_NUM IN (3, 4)
    GROUP BY BOOK.BOOK_CODE, BOOKTITLE
) B
WHERE B.BRANCH_COUNT = 2;

【讨论】:

  • 第一个已经死了,教授希望我们使用子查询,但我不知道具体如何/在哪里。谢谢!
【解决方案3】:

请试试这个:

SELECT  BK.BOOKTITLE
FROM    BOOK BK
INNER JOIN INVENTORY INV1
ON INV1.BOOK_CODE = BK.BOOK_CODE
INNER JOIN INVENTORY INV2
ON INV2.BOOK_CODE = BK.BOOK_CODE
WHERE   INV1.BRANCH_NUM = 3
AND INV2.BRANCH_NUM = 4

【讨论】:

    【解决方案4】:

    您的问题会告诉您表格中您需要的字段,这为您提供了一个起点:

    SELECT booktitle FROM book . . .
    

    仅此一项即可为您提供表book 中每个booktitle 的列表,但您希望将其过滤到仅branch_num 3 和4 中的那些书。

    当您JOIN 两个或多个表时,您希望根据某些共享值匹配行; book_code,在这种情况下。

    由于您只想查看两个表中的那些书,因此您需要使用INNER JOIN。 (我假设 ON_HAND 是一个 INT 描述分支中的副本数。)

    SELECT booktitle FROM book
    INNER JOIN inventory USING (book_code)
    WHERE inventory.onhand > 0
    

    该查询将返回任何分支中可用的每本书的列表。修改查询,可以限制只查询branch_num3中的那些书:

    SELECT booktitle FROM book
    INNER JOIN inventory USING (book_code)
    WHERE inventory.onhand > 0 AND inventory.branch_num = 3
    

    ...但是您在分支 3 和分支 4 中都需要书籍,因此您需要在 inventory 表上进行另一次联接。但是如何区分这两者呢?使用表别名:

    SELECT booktitle FROM book
    INNER JOIN inventory AS inventory1 USING (book_code)
    INNER JOIN inventory AS inventory2 USING (book_code)
    WHERE inventory1.onhand > 0 AND inventory1.branch_num = 3 AND inventory2.onhand > 0 AND inventory2.branch_num = 4 
    

    这应该可以满足您的需求。

    有关联接的更好解释,请参阅MySQL JoinsA Visual Explanation of SQL Joins

    [注意:这个问题也可能是使用子查询,你应该尝试这样做。]

    【讨论】: