我目前正在學習如何在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你用什麼方言? –