如何有效地使用计数功能来改进我的表格

时间:2016-01-14 14:24:56

标签: sql oracle oracle11g count

我有两个表,一个调查表和一个属性表,我正在尝试编写一个选择脚本,该脚本将显示一个属性列表,其中包含对每个属性执行的调查数。 起初我刚刚在我的调查实体中添加了一个属性,说明了调查的数量,因此我可以编写一个简单的脚本。 例如。

SELECT Property_Address, No_of_Survey
FROM Property, Survey 
WHERE Property.Property_ID = Survey.Property_ID; 

然而,由于我是新手,我很快意识到这是糟糕的设计,因为用户每次都必须更新调查次数,而数据库应该进行计算。 那么我认为我的选择查询应该真的使用计数功能,现在我只是完全混淆了自己! 我已经提出了一个查询,但它没有工作,说明该列的含义模糊不清。这是我的新剧本;

SELECT Property_Address, COUNT(Survey_ID) AS SurveyCount
FROM Property, Survey
WHERE Property_ID.Property_ID = Survey.Property_ID
GROUP by property_ID;

我真的想知道我的创建表是否需要更改,以便我的查询按预期工作或者只是需要更改查询。

这是我的表格;

CREATE TABLE Property 
(
Property_ID varchar(5),                              
Property_Address varchar(25),
Property_Town varchar(25),
Property_Postcode varchar(25),                       
Asking_Price varchar2(20),                           
Date_Registered DATE,                                
Property_Type varchar2(50),                          
Num_Rooms varchar2(50),                              
Buyer_ID varchar(5),                                 
Seller_ID varchar(5),                                
Branch_ID varchar(5),                                
PRIMARY KEY (Property_ID),                           
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_ID),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID)
);

CREATE TABLE Survey 
(                                                          
Survey_ID varchar(5),                                      
No_of_Survey varchar2(10),                                 
Survey_Type varchar2(50),                                  
Property_ID varchar(5),                                    
Buyer_ID varchar(5),                                       
PRIMARY KEY (Survey_ID),                                   
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_Id)
);

1 个答案:

答案 0 :(得分:2)

首先,您应该学习正确的显式JOIN语法。 。 。并使用它。此外,GROUP BY列应与未聚合的SELECT列匹配:

SELECT p.Property_Address, COUNT(s.Survey_ID) AS SurveyCount
FROM Property p JOIN
     Survey s
     ON p.Property_ID = s.Property_ID
GROUP by p.Property_Address;

请注意,表别名使查询更易于编写和读取。最后,如果您想要所有属性,即使是那些没有调查的属性,请使用LEFT JOIN

SELECT p.Property_Address, COUNT(s.Survey_ID) AS SurveyCount
FROM Property p LEFT JOIN
     Survey s
     ON p.Property_ID = s.Property_ID
GROUP by p.Property_Address;