搞定了100分!两个问题! sqlserver
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搞定了100分!两个问题! sqlserver相关的知识,希望对你有一定的参考价值。
大家都知道!右键新建表,在设计表的视图中可以设置多个字段!
但是我想如何通过t-sql来创建多个主键!
我已经测试过了!
create table test
(
id int primary key ,
id2 int primary key,
)
消息 8110,级别 16,状态 0,第 2 行
无法将多个 PRIMARY KEY 约束添加到表 'test'。
另外一个:
昨天一个网友搞了一个问题!
表如下:
ID_data1_data2
1___1_____a
2___2_____b
3___2_____b
4___3_____c
5___3_____c
6___4_____d
想去掉那些重复的data1与data2项,得到如下结果:
1___1___a
2___2___b
4___3___c
6___4___d
最后我通过:
select min (id) as id,data1,data2 from biao group by data1,data2
搞定了他的要求,但是我想到一个可怕的问题!怎么想也搞不定!
望高手帮忙!
问题是
1___1_____a
2___2_____b
3___2_____b
4___2_____b
5___3_____c
6___3_____c
7___4_____d
8___4_____d
9___4_____d
///////////////////////////////////
我要获取的数据为:
1___1_____a
2___2_____b
3___2_____b
5___3_____c
6___3_____c
7___4_____d
8___4_____d
简单点:也就是想从每一个不同的type(data1)中找出两条记录,如果没有两条记录,那么就获取一条记录!
create table test
(
id int,
id2 int,
constraint PK_test_idid2 primary key (id, id2)
)
另外告诉你哦,给表添加约束有很多种语法的,直接在字段定义后加primary key是最简单的一种,他会建立一个由系统自动命名的主键约束。
如果要自己命名约束,完整的语法是:
id int constraint 约束名 primary key
如果要把多个字段设为联合主键,只要在primary key后面加个括号,然后把字段名都写在里面就可以了,比如:
id2 int constraint 约束名 primary key (id, id2)
还有一点,constraint 约束名 primary key (id, id2)这个子句可以跟在任何一个字段后面,也可以在字段定义完成后再单独定义,偶觉得语法还是比较自由的哈哈~
至于你的第二个问题么~
偷懒方法:就是取出data1相同记录中id最大和id最小的记录,再用union all连接起来,再去掉重复记录,排下序就OK了……可能有点不符合要求~
select distinct *
from (select min (id) as id,data1,data2
from test
group by data1,data2
union all
select max (id) as id,data1,data2
from test
group by data1,data2) as tmp
order by id
完美方法:你看吧,我不想说……这是参考字段数不确定时,SQL交叉表的建立方法。头都晕了……
declare @sql varchar(max)
set @sql = ''
select @sql = @sql + ' union all select top 2 * from test where data1 = ''' + data1 + ''''
from (select distinct data1 from test) as temp
set @sql = right(@sql, len(@sql) - 11)
exec (@sql) 参考技术A create table test
(
id int primary key ,
id2 int primary key,
)
--primary key 是主键 一个表中只能有一个主键 所以错了
create table test
(
id int primary key ,
id2 int
)
第二个没懂 参考技术B 我也不是太懂 发表点个人观点
第一个
就是复合主键了
create table test(
id int,
id2 int,
primary key(id,id2)
)
第二个
我想一个 笨的方法 就是 首先取出去掉data1 重复项的虚表 然后在原来的表做等值连接 查询 参考技术C 第一个不懂,第二个(用编程语言来说)可以先把全部读出来,反正ID是唯一的,再比较data1,如果不重复则记下这个ID,然后再用select的where id=''来查找。
PetaPoco join连接问题
petapoco是一个轻型的ORM,在这里不做详细介绍了。本文主要对如何对petapoco对象使用join连接,查询相关数据库。
1.首先创建一个简单的数据库,包含两个表。本文使用sql server 2008创建,如下图所示。
SubTask表中有三个属性分别为Id、TaskId和Status,Task有两个属性分别为Id和Style,都是简单定义的,如下图所示。
2,创建一个控制台程序,加载petapoco.dll,然后分别创建两个petapoco对象,分别为subtask和task。注意join连接有多种形式,这里我选择left join。同时要注意连接顺序,一定要在创建的对象中定义被连接的对象。如我在subtask类中定义了task类。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Demo1 8 { 9 [PetaPoco.TableName("SubTask")] 10 [PetaPoco.PrimaryKey("Id")] 11 public class subtask 12 { 13 public int Id { get; set; } 14 public int TaskId { get; set; } 15 public int Status { get; set; } 16 17 [PetaPoco.Ignore] 18 public task t { get; set; }//这个一定要有,不然会报错! 19 } 20 }
task类如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Demo1 8 { 9 [PetaPoco.TableName("Task")] 10 [PetaPoco.PrimaryKey("Id")] 11 public class task 12 { 13 public int Id { get; set; } 14 public int Style { get; set; } 15 } 16 }
3,在这之前一定要配置app.config。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 5 </startup> 6 <connectionStrings> 7 <add name="connection" connectionString="server=.;integrated security=SSPI;database=DemoOne" 8 providerName="System.Data.SqlClient"/> 9 </connectionStrings> 10 </configuration>
下面就是调用petapoco sql builder创建sql语句了,其实sql语句大小写都可以,没有区别,也是刚学习。left join是显示左侧表的所有信息,右侧按照条件ON显示,没有的话显示为空。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Demo1 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 var db = new PetaPoco.Database("connection"); 14 var sql = PetaPoco.Sql.Builder 15 .Append("Select subt.*,ta.* From SubTask subt") 16 .Append("LEFT JOIN Task ta ON subt.TaskId=ta.Id"); 17 18 var sub = db.Query<subtask, task>(sql).ToList(); 19 20 foreach (var b in sub) 21 { 22 Console.WriteLine("{0}-{1}-{2}", b.Id, b.TaskId, b.Status); 23 } 24 25 Console.WriteLine("next..."); 26 27 } 28 } 29 }
4,在ssms中,调用使用sql语句显示的结果如下:
use DemoOne select subt.*,ta.* from SubTask subt left join Task ta on subt.TaskId=ta.Id go
以上是关于搞定了100分!两个问题! sqlserver的主要内容,如果未能解决你的问题,请参考以下文章
计算机网络:主机A向主机B连续发送了两个TCP报文段,其序号分别为70和100。