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