2009-10-29 46 views
2

我一直在使用SQL多年,但主要是使用SQL Studio(等)中的查询设计器来组合我的查询。我最近找到了一些时间来真正“学习”一切正在做的事情,并为自己设定了以下相当简单的任务。在开始之前,我想问SOF社群他们对问题,可能的答案和他们可能有的任何提示的想法。一些SQL问题

问题是;

  1. 找到所有记录瓦特/特定列重复(如链接ID是在整个表超过1个记录)从一个链接表
  2. SUM价格在同一查询中(内选择选择? )
  3. 解释4个连接的区别; LEFT,RIGHT,OUTER,INNER从一个表
  4. 将数据复制到另一基于SELECT和WHERE标准

输入欢迎&理解。

克里斯

+3

这味道像hw。 –

回答

1

我建议您从关注此主题的一些教程开始。对于在SQL中从初级到中级移动的人而言,您的问题并不罕见。 SQLZoo是学习SQL的绝佳资源,因此请考虑以下事项。

在回答你的问题:

1)找到一个重复的所有记录在一个特定的列

有两个步骤在这里:找到重复的记录,并选择那些记录。要了解你应该沿着线做一些重复的记录:

select possible_duplicate_field, count(*) 
from table 
group by possible_duplicate_field 
having count(*) > 1 

我们在这里所做的一切选择从一个表,然后我们想检查重复字段分组它。计数函数然后给我一个该组内项目数的计数。 HAVING子句表示我们想要在分组之后进行过滤,以仅显示具有多个条目的组。

这本身就很好,但它并没有给你带有这些值的实际记录。如果您知道重复的值,那么你会这样写:

select * from table where possible_duplicate_field = 'known_duplicate_value' 

我们可以使用内选择选择来获得比赛的名单:从链接

select * 
from table 
where possible_duplicate_field in (
    select possible_duplicate_field 
    from table 
    group by possible_duplicate_field 
    having count(*) > 1 
) 

2)SUM价格在同一查询内表

这是一个简单的两个表之间与这两者的SUM JOIN:

select sum(tableA.X + tableB.Y) 
from tableA 
join tableB on tableA.keyA = tableB.keyB 

您在这里做的是将两个表连接在一起,其中这两个表由关键字段链接。在这种情况下,这是一个自然的连接,它可以像你期望的那样工作(也就是让我从左边的表中得到一切,它在右边表中有一个匹配的记录)。

3)解释4个连接的区别;左,右,外,内

考虑两个表A和B.在这种情况下,“左”和“右”的概念稍微清晰一点,如果您从左到右阅读您的SQL。所以,当我说:

select x from A join B ... 

左表是“A”,右表是“B”。现在,当您明确声明“LEFT”SQL语句时,您声明您要加入的两个表中的哪一个是主表。我的意思是:我首先扫描哪张表?顺便说一下,如果你省略了LEFT或RIGHT,那么SQL隐式地使用了LEFT。

对于INNER和OUTER,您声明在其中一个表中不存在匹配项时要执行的操作。 INNER声明您希望主表中的所有内容(如使用LEFT或RIGHT声明的)在辅助表中存在匹配的记录。因此,如果主表包含键“X”,“Y”和“Z”,并且辅助表包含键“X”和“Z”,那么INNER将只返回“X”和“Z”记录两张桌子。

当使用OUTER时,我们说:给我一切从主表和任何匹配次表。因此,在前面的例子中,我们会在输出记录集中获得“X”,“Y”和“Z”记录。但是,应该来自辅助表的键值为“Y”的字段中将存在NULL,因为它不存在于辅助表中。

4)从一台基于SELECT和WHERE条件

这是相当琐碎,我很惊讶你从来没有遇到过的数据复制到另一个。这是在INSERT语句中一个简单的嵌套SELECT(这可能不是由你的数据库的支持 - 如果没有,请尝试下一个选项):

insert into new_table select * from old_table where x = y 

这是假设表具有相同的结构。如果你有不同的结构,那么你需要指定列:

insert into new_table (list, of, fields) 
    select list, of, fields from old_table where x = y 
+0

梦幻般的史蒂夫。写得很好,例子清楚地解释了事情。你应该写一本书! ;) – dooburt

1

比方说,你有2个表命名为:

  • [订单行]与列[ID,的OrderId,产品编号,数量,状态]
  • [产品]与[ID,名称,价格]

1)具有超过1行命令的所有订单项目(它在技术上一样找上的OrderId重复:):

之间
select OrderId, count(*) 
from OrderLine 
group by OrderId 
having count(*) > 1 

2)总价格了订单的所有顺序线1000

select sum(p.Price * ol.Qty) as Price 
from OrderLine ol 
inner join Product p on ol.ProductId = p.Id 
where ol.OrderId = 1000 

3)差联接:

  • 一个内连接B =>采取一切一个具有匹配与b。如果未找到b,则a将不会被退回
  • a左连接b =>全部a,与b匹配,即使未找到b也包含a
  • a righ join b => b left join一个
  • 一个外部联接b =>(左连接b)工会(右连接b)

4)复制命令行历史记录表:

insert into OrderLinesHistory 
(CopiedOn, OrderLineId, OrderId, ProductId, Qty) 
select 
    getDate(), Id, OrderId, ProductId, Qty 
from 
    OrderLine 
where 
    status = 'Closed' 
+0

对1的回答不正确--OP要求重复计数 – RichardOD

+0

谢谢manitra!这个问题似乎引起了各种争议,所以我会接受你的答案。谢谢。 :) +1 – dooburt

+0

我纠正了#1(w /和w/o混淆:) –

-1

要回答#4并可能显示至少一些SQL的理解和事实这不是硬件,只是我吨渴望学习最佳实践;

SET NOCOUNT ON; 
DECLARE @rc int 
if @what = 1 
    BEGIN 
     select id from color_mapper where product = @productid and color = @colorid; 
     select @rc = @@rowcount 
     if @rc = 0 
     BEGIN 
      exec doSavingSPROC @colorid, @productid; 
     END 
    END 
END 
+0

-1不好的例子,没有回答#4,与问题没有真正相关性(并没有显示对SQL的理解,因为你更可能从其他人编写的SP复制它) – finnw

+0

其实我写了SQL。如Steve N所示,这不是最好的方式,但问题的目的是为了展示我对SQL的理解 - 许多人认为这些问题都是针对HW的。 – dooburt

+0

此外,你的态度很差。你是否只是无意访问而回答问题,但要记下答案? – dooburt