使用SQL QUERY的高级SELECT语句

时间:2014-03-12 16:19:51

标签: sql oracle oracle11g

我正在尝试使用sql查询为所有只生长番茄(name_id)的人显示nameveg_grown属性,结果显示名称的升序属性。

CREATE TABLE people
(
    name_id# CHAR(4) PRIMARY KEY,
    name VARCHAR2(20) NOT NULL,
    address VARCHAR2(80) NOT NULL,
    tel_no CHAR(11) NOT NULL
)

CREATE TABLE area
(
    area_id# CHAR(5) PRIMARY KEY,
    name_id# REFRENCES people,
    area_location_adress VARCHAR2(80) NOT NULL
)

CREATE TABLE area_use
(
     area_id# REFERENCES area,
     veg_grown VARCHAR (20) NOT NULL
)

但是veg_grown属性与people表没有关系,但是人和area_use表是通过区域表链接的,所以我尝试使用这样的INNER JOIN混淆了我自己,甚至没有工作:

SELECT 
    name, name_id
FROM 
    people
INNER JOIN 
    area USING (name_id)

SELECT area_id
FROM area
INNER JOIN area_use USING (area_id)
WHERE veg_grown = 'tomato'
ORDER BY name ASC;

当然必须有一种方法可以选择只在SQL查询中生长番茄的name_idname

我会接受任何帮助或建议:)谢谢

3 个答案:

答案 0 :(得分:1)

AFAICT您只想要所有信息都可用的条目,因此没有左/右连接。

SELECT p.name_id, p.name
FROM people p
JOIN area a
ON p.name_id = a.name_id
JOIN area_use au
ON a.area_id = au.area_id
WHERE au.veg_grown = 'tomato'
ORDER BY p.name ASC

答案 1 :(得分:1)

SELECT p.name, p.name_id
FROM people p
JOIN area a
  ON p.name_id = a.name_id
JOIN area_use au
  ON a.area_id = au.area_id
 AND au.veg_grown = 'tomato'
LEFT JOIN area_use au2
  ON a.area_id = au2.area_id
 AND au2.veg_grown <> 'tomato'
WHERE au2.area_id IS NULL;

这将使用LEFT JOIN来查找种植西红柿的人。要找到种植西红柿和其他任何东西的人,请移除LEFT JOIN部分及其下方的所有内容。

An SQLfiddle to test with

编辑:如果您的字段名称在实际表格中包含#,则需要引用标识符并添加#,我将其留在此示例中。

答案 2 :(得分:0)

我不是百分之百确定您的数据模型,但这似乎是您尝试做的事情。

SELECT name, people.name_id
FROM people, area, area_use
WHERE area.area_id = area_use.area_id
AND veg_grown = 'tomato'
AND area.name_id = people.name_id
ORDER BY name ASC;