2011-10-10 65 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語法和思維方式

相關問題