搞定了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的主要内容,如果未能解决你的问题,请参考以下文章

两个discuz论坛怎么样共用一个数据库,100分

计算机网络:主机A向主机B连续发送了两个TCP报文段,其序号分别为70和100。

VB WebBrowser如何独立COOKIE,解决了100分?

做完100+外包项目后,我用4维度提问法搞定产品需求

高考估分查分选志愿一键搞定_支付宝又操办了件人生大事

CCF201403-5 任务调度(100分题解链接)