2017-10-17 50 views
-3
/* Create a table called tbl1 */ 
CREATE TABLE tbl1(id integer PRIMARY KEY, name text, lang text); 

/* Create few records in this table */ 
INSERT INTO tbl1 VALUES(1,'John', 'Perl'); 
INSERT INTO tbl1 VALUES(2,'Pete', 'Perl'); 
INSERT INTO tbl1 VALUES(3,'Sam', 'Java'); 
INSERT INTO tbl1 VALUES(4,'John', 'Php'); 
INSERT INTO tbl1 VALUES(5,'Sam', 'Perl'); 
INSERT INTO tbl1 VALUES(6,'Sam', 'Php'); 
INSERT INTO tbl1 VALUES(7,'Pete', 'C'); 
INSERT INTO tbl1 VALUES(8,'Bob', 'Java'); 

派生知道Perl和Php的人的名字。如何使sql(postgresql)查詢?

+0

你有嘗試過什麼嗎? –

+1

首先,規範化你的數據... –

+1

從數據透視到半哈希將會有大約20-30個可行的答案。這似乎是作業,但你應該嘗試學習一個答案。 – Twelfth

回答

0

該OP包含非常少的信息。這是你需要的嗎?

SELECT Name 
FROM tbl1 
WHERE lang = 'Perl' AND lang = 'Php' 

以備參考;你應該提供一個最低限度的工作例子,就像你在這裏所做的那樣,但是也應該提供你實際嘗試過的,你缺乏的。

如果這個查詢是你所需要的,那麼它是非常直接的,你的問題應該已經可以用googling幾分鐘來管理。

+0

不,此查詢返回0行 – Max

+0

必須返回名稱'Sam'和'John'。 – Max

+0

'lang ='Perl'AND lang ='Php''永遠不會是真的 –

0
SELECT distinct(name) 
FROM tbl1 
WHERE name IN (SELECT name FROM tbl1 WHERE lang = 'Perl') 
    AND name IN (SELECT name FROM tbl1 WHERE lang = 'Php'); 

是好答案?我不這麼認爲。 我想找到更好的方法。

2個額外的答案

SELECT n FROM (
    SELECT tbl1.name, string_agg(tbl1.lang, '-') 
    FROM tbl1 
    GROUP BY name) AS t (n, l) 
WHERE 
    position('Perl' in l) <> 0 
AND 
    position('Php' in l) <> 0; 

===================================

SELECT t1.name FROM (
    SELECT name FROM tbl1 WHERE lang = 'Perl' 
) AS t1, (
    SELECT name FROM tbl1 WHERE lang = 'Php' 
) AS t2 
WHERE t1.name = t2.name;