如何使sql(postgresql)查询?

问题描述:

/* 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

该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''永远不会是真的 –

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;