2011-10-10 67 views
1

我目前正在学习如何在SQL中编程。我有table1firstname,lastnameroomname
而且我有另一个table2,它具有所有roomnames如何从包含所有限制的数据库中选择数据?

我想知道如何选择firstnamelastname从谁已经在所有的房间的人。我需要GROUP BY吗?

+0

SQL你用什么方言? –

回答

3

对于TRANSACTSQL,如果你知道在你的第一个表中的每一行都是不同的,那么这会工作:

SELECT 
    firstname, 
    lastname 
FROM 
    table1 
GROUP BY 
    firstname, 
    lastname 
HAVING 
    COUNT(DISTINCT RoomName) = (SELECT COUNT(*) FROM table2) 

这应该是相当有效的,但不是太灵活,如果你想忽略某些客房。

+0

如果在table1中重复名称,该怎么办? –

+1

如果名字重复,那就好了,只要它们总是有不同的房间。也就是说,firstname,lastname和roomname的组合对于每一行都是唯一的。 –

+0

如果他们有相同的房间,会怎么样?这基本上是我现在面临的问题... –

0

您的数据模型不适合您的问题。
如果人们能够在多个房间,你需要一个第三个表来实现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

集团通过是一个命令,以组的结果

,我可以看到你有重复的表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语法和思维方式

相关问题