使用第三个表SQLite的一对多查询

时间:2016-06-15 18:29:48

标签: sql sqlite

我有一个表设计处理各种实体的'笔记'。

notes表有一个主键,notes_id,一个音符字段和created_by日期字段。

对于一个实体,比如客户,存在一个关系表,customer_notes,包含两个id,customer_id和note(s)_id。我想选择与一个客户相关的所有票据,并根据票据日期进行排序。

作为SQL初学者,如何实现这一目标? 目前我有:

SELECT * FROM note 
WHERE note.id 
IN (SELECT * FROM customer_note
WHERE customer_id = 11)

和11是客户ID。上面给出了一个“只有一个结果,一个选择是表达式的一部分”错误。

这里有很多关于类似事情的问题,但大多数只涉及两个表格。

4 个答案:

答案 0 :(得分:1)

另一种选择是将查询重写为:

SELECT *
FROM   note
WHERE  note.id 
IN     (SELECT note_id
        FROM   customer_note
        WHERE  customer_id = 11)
ORDER  BY note_date DESC;

答案 1 :(得分:0)

您的查询错误,因为您在子查询中包含所有列,而不仅仅是注释ID。

你最好一起加入这些表格,如下:

SELECT  -- specify whichever columns you want from either table here
   n.id
   n.note,
   n.note_date
FROM
   note n  -- n is the alias for the note table
INNER JOIN
   customer_note cn  -- cn is the alias for the customer_note table
   ON (cn.note_id = n.id)  -- These are the columns that the two tables share / join on
WHERE
   cn.customer_id = 11  -- Your filter criterion
ORDER BY
  note_date DESC;  -- Sort on note_date (DESC or ASC)

答案 2 :(得分:0)

根据Nicarus的回答,我得到了以下工作:

SELECT * 
FROM note 
WHERE note.id 
IN (
  SELECT note_id 
  FROM customer_note 
  WHERE customer_id = 11
) 
ORDER BY created_on

然而,使用INNER JOIN看起来更干净。

答案 3 :(得分:0)

欢迎来到SQL世界:)

首先,您尝试编写的查询可以进行一些调整。

SELECT n.*
FROM   note n
WHERE  n.id IN (
  SELECT DISTINCT cn.note_id
  FROM   customer_note cn
  WHERE  cn.customer_id = 11
)

...但是,虽然上面的 工作,但我认为你最好不要学习JOIN。特别是内连接,这可能是您将遇到的最常见的连接类型,在这种情况下您正是需要的。

SELECT n.*
FROM   note n
JOIN   customer_note cn
ON     cn.note_id = n.id
WHERE  cn.customer_id = 11

这种语法阅读和理解更加自然,它可以完全满足您的需求。您可以使用JOIN在两个表之间生成笛卡尔积(或“组合”)。直接在ON表定义之后的JOIN语句允许您根据提供的条件过滤笛卡尔积。在这种情况下,您对customer_note表与注释'id的注释对齐感兴趣。最后,WHERE语句允许您仅根据特定ID的customer_note条目进行选择。

(请注意,在SQLite中,INNER-JOIN非常常见,您可以简单地说JOIN而不是INNER JOIN。这是大多数现代SQL常见的语法糖,可以减少线路噪音。)

而且,既然您询问了如何对结果进行排序,我们可以进一步采取最后一个查询并执行此操作。

SELECT    n.*
FROM      note n
JOIN      customer_note cn
ON        cn.note_id = n.id
WHERE     cn.customer_id = 11
ORDER BY  n.note_date ASC