我目前正在学习如何在SQL中编程。我有table1
与firstname
,lastname
和roomname
。
而且我有另一个table2
,它具有所有roomnames
。如何从包含所有限制的数据库中选择数据?
我想知道如何选择firstname
和lastname
从谁已经在所有的房间的人。我需要GROUP BY
吗?
我目前正在学习如何在SQL中编程。我有table1
与firstname
,lastname
和roomname
。
而且我有另一个table2
,它具有所有roomnames
。如何从包含所有限制的数据库中选择数据?
我想知道如何选择firstname
和lastname
从谁已经在所有的房间的人。我需要GROUP BY
吗?
对于TRANSACTSQL,如果你知道在你的第一个表中的每一行都是不同的,那么这会工作:
SELECT
firstname,
lastname
FROM
table1
GROUP BY
firstname,
lastname
HAVING
COUNT(DISTINCT RoomName) = (SELECT COUNT(*) FROM table2)
这应该是相当有效的,但不是太灵活,如果你想忽略某些客房。
如果在table1中重复名称,该怎么办? –
如果名字重复,那就好了,只要它们总是有不同的房间。也就是说,firstname,lastname和roomname的组合对于每一行都是唯一的。 –
如果他们有相同的房间,会怎么样?这基本上是我现在面临的问题... –
您的数据模型不适合您的问题。
如果人们能够在多个房间,你需要一个第三个表来实现N:M关系这样的:
(测试用的PostgreSQL 9.0)
CREATE SCHEMA x;
CREATE TABLE x.person(person_id integer primary key, firstname text, lastname text);
CREATE TABLE x.room(room_id integer primary key, roomname text);
CREATE TABLE x.person_room(person_id integer, room_id integer);
INSERT INTO x.person VALUES(1,'fred', 'foo'), (2,'gert', 'goo'), (3,'harry', 'hoo');
INSERT INTO x.room VALUES(1,'room1'),(2,'room2'), (3,'room3');
INSERT INTO x.person_room VALUES(1,1),(1,2),(1,3),(2,1),(2,2),(3,1);
你的查询,则可以像这样(示范你不需要一个GROUP BY
):
编辑:甚至更好,没有LEFT JOIN
,只是半加入EXISTS
需要。也应该快。
SELECT p.*
FROM x.person p
WHERE NOT EXISTS(
SELECT *
FROM x.room r
WHERE NOT EXISTS (
SELECT *
FROM x.person_room pr
WHERE pr.person_id = p.person_id
AND pr.room_id = r.room_id));
输出:
person_id | firstname | lastname
-----------+-----------+----------
1 | fred | foo
集团通过是一个命令,以组的结果
,我可以看到你有重复的表1: 比方说:
**table1:**
firstname lastname roomname
Theodore Hello roomA
Mike World roomA
Theodore Hello roomB
Theodore Hello roomC
NickThe Greek roomC
And **table2:**
roomname
roomA
roomB
roomC
正如你所见,Theodore是从table2的所有房间传过来的。 在共同的语言(用于构建SQL查询的一个很好的方法),你会说: 抓住从表1谁从表2中的所有行传递的人:
在这里看看: Fetching only rows that match all entries in a joined table (SQL)
但是,正如杰米所说,这不是一个适当的SQL语法和思维方式
SQL你用什么方言? –