我有一个表设计处理各种实体的'笔记'。
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。上面给出了一个“只有一个结果,一个选择是表达式的一部分”错误。
这里有很多关于类似事情的问题,但大多数只涉及两个表格。
答案 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