Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一些SQL问题_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

一些SQL问题

一些SQL问题,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我已经使用SQL多年了,但主要是使用SQL Studio中的查询设计器等来组合我的查询。我最近找到了一些时间来真正了解每件事都在做什么,并为自己设定了以下相当简单的任务。在开始之前,我想问一下SOF社区他们对这些问题的看法、可能的答案以及他们可能有的任何提示 问题是, 在特定列中查找所有重复记录,例如,链接id在整个表中的多个记录中 同一查询中链接表的总价在select中选择? 解释4个连接之间的差异;左、右、外、内 根据SELECT和WHERE条件将数据从一个表复制到另一个表 欢迎并感谢您的意

我已经使用SQL多年了,但主要是使用SQL Studio中的查询设计器等来组合我的查询。我最近找到了一些时间来真正了解每件事都在做什么,并为自己设定了以下相当简单的任务。在开始之前,我想问一下SOF社区他们对这些问题的看法、可能的答案以及他们可能有的任何提示

问题是,

在特定列中查找所有重复记录,例如,链接id在整个表中的多个记录中 同一查询中链接表的总价在select中选择? 解释4个连接之间的差异;左、右、外、内 根据SELECT和WHERE条件将数据从一个表复制到另一个表 欢迎并感谢您的意见


Chris

假设您有两个名为:

[OrderLine]和[Id、OrderId、ProductId、Qty、Status]列 [产品]带有[标识、名称、价格] 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匹配的所有a。如果未找到b,则不会返回a a left join b=>获取所有a,将它们与b匹配,即使找不到b也包括a a右连接b=>b左连接a a外部联接b=>a左联接b并集a右联接b 4将订单行复制到历史记录表:

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

回答4,或者至少表现出对SQL的一些理解,以及这不是HW的事实,只是我在努力学习最佳实践

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

我建议您从以下有关此主题的教程开始。您的问题对于从SQL初学者过渡到中级的人来说并不少见。是学习SQL的优秀资源,所以请考虑以下内容:

针对您的问题:

1查找特定列中有重复项的所有记录

这里有两个步骤:查找重复记录并选择这些记录。要查找重复记录,您应该按照以下步骤进行操作:

select possible_duplicate_field, count(*) 
from   table 
group by possible_duplicate_field 
having count(*) > 1
我们在这里所做的是从表中选择所有内容,然后根据要检查重复项的字段对其进行分组。然后,count函数会计算该组中的项目数。HAVING子句表示我们希望在分组后进行筛选,以仅显示具有多个条目的组

这本身是很好的,但它并没有提供包含这些值的实际记录。如果您知道重复的值,那么您可以这样写:

select * from table where possible_duplicate_field = 'known_duplicate_value'
我们可以在SELECT中使用SELECT来获取匹配项列表:

select * 
from table 
where possible_duplicate_field in (
  select possible_duplicate_field 
  from   table 
  group by possible_duplicate_field 
  having count(*) > 1
)
2同一查询中链接表的总价

这是两个表之间的简单联接,其总和为:

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。现在,当您在SQL语句中显式地说left时,您正在声明要连接的两个表中的哪一个是主表。我的意思是:我首先扫描哪个表?顺便说一句,如果省略左侧或右侧,那么SQL将隐式使用左侧

对于内部和外部,您要声明当其中一个表中不存在匹配项时要执行的操作。内部声明您希望主表中的所有内容都是使用LEFT或RIGHT声明的,而辅助表中有匹配的记录。因此,如果主表包含键X、Y和Z,而次表包含键X和Z,则内部表将仅返回两个表中的X和Z记录

当使用OUTER时,我们的意思是:给我主表中的所有内容以及与次表匹配的任何内容。因此,在前面的示例中,我们将在输出记录集中获得X、Y和Z记录。但是,由于键值Y在辅助表中不存在,因此应该来自辅助表的字段中会有空值

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

你对1的回答不正确-OP需要重复计数谢谢你,曼尼特拉!这个
斯蒂恩似乎引起了各种各样的争议,所以我接受你的答案。谢谢+1-1个坏例子,没有回答4个问题,与问题不相关,也没有显示出对SQL的理解,因为您很可能是从别人编写的SP中复制的。实际上,我编写了SQL。这并不是Steve N所展示的最好的方法,但是这个问题的目的是展示我对SQL的理解——因为很多人都认为这些问题是针对HW的。而且,你的态度很差。你只是访问问题,不想帮忙,而是记下答案吗?太棒了,史蒂夫。写得好,例子解释得很清楚。你应该写一本书;