use test
create table student(
id int identity(1,1) primary key,
[name] nvarchar(50) not null
)create table book(
id int identity(1,1) primary key,
[name] nvarchar(50)not null,
studentid int not null
)insert into student values('張三')
insert into student values('李四')
insert into student values('王五')
select * from student
--張三借的書
insert into book values('紅樓',1)
insert into book values('大話紅樓',1)
--李四借的書
insert into book values('三國',2)
--王五沒借書
--一本錯誤的記錄
insert into book values('錯誤時怎樣練成的',111)
--左連線
select s.name,b.name from student as s
left join book as b on s.id=b.studentid
--右連線
select s.name,b.name from student as s
right join book as b on s.id=b.studentid
要用linq實現左連線,寫法如下
dataclasses1datacontext db = new dataclasses1datacontext();
var leftjoinsql = from student in db.student
join book in db.book on student.id equals book.studentid into temp
from tt in temp.defaultifempty()
select new
;
用linq實現右連線,寫法如下
dataclasses1datacontext db=new dataclasses1datacontext();
var rightjoinsql = from book in db.book
join stu in db.student on book.studentid equals stu.id into jointemp
from tmp in jointemp.defaultifempty()
select new ;
附加:
datatable dttable = new datatable();
datatable dttable2 = new datatable();
datarow row;
datarow row2;
dttable.columns.add("id", typeof(string));
dttable.columns.add("age", typeof(string));
dttable.columns.add("city", typeof(string));
dttable2.columns.add("id", typeof(string));
dttable2.columns.add("age", typeof(string));
dttable2.columns.add("city", typeof(string));
row = dttable.newrow();
row[0] = "001";
row[1] = "2012-01-01";
row[2] = "bj";
dttable.rows.add(row);
row = dttable.newrow();
row[0] = "001";
row[1] = "2012-01-01";
row[2] = "tj";
dttable.rows.add(row);
row = dttable.newrow();
row[0] = "001";
row[1] = "2012-01-01";
row[2] = "hb";
dttable.rows.add(row);
row = dttable.newrow();
row[0] = "002";
row[1] = "2012-01-01";
row[2] = "sz";
dttable.rows.add(row);
row = dttable.newrow();
row[0] = "002";
row[1] = "2012-01-01";
row[2] = "hg";
dttable.rows.add(row);
row = dttable.newrow();
row[0] = "003";
row[1] = "2012-01-01";
row[2] = "sz";
dttable.rows.add(row);
row = dttable.newrow();
row[0] = "004";
row[1] = "2012-01-01";
row[2] = "sz";
dttable.rows.add(row);
row2 = dttable2.newrow();
row2[0] = "001";
row2[1] = "2011-01-01";
row2[2] = "gz";
dttable2.rows.add(row2);
row2 = dttable2.newrow();
row2[0] = "001";
row2[1] = "2011-01-01";
row2[2] = "tj";
dttable2.rows.add(row2);
row2 = dttable2.newrow();
row2[0] = "002";
row2[1] = "2012-01-01";
row2[2] = "sz";
dttable2.rows.add(row2);
listst = new list();
stu a1 = new stu();
var query = from s in dttable.select()
join c in dttable2.select() on s.field("id") equals c.field("id") into gc
from gci in gc.defaultifempty()
// where s.field("age") > ( gci == null ? 0 : gci.field("age"))
// where gci != null
where convert.todatetime(s.field("age")) > (gci == null ? convert.todatetime(null) : convert.todatetime(gci.field("age")))
select new
//,//b1=new,
s,gci,
};// foreach (var item in query.select(p => p.b1).distinct())
// foreach (var item in query.select(p => new ).distinct())
foreach (var item in query.select(p => p.gci).distinct())
console.writeline("///");
var vv = dttable.select().select(p => p.field("id")).except(dttable2.select().select(p => p.field("id")));
foreach (var item in vv.distinct())
關於左外連線和右外連線
當使用left join的時候 select from a left join b on a.id b.id 這時候a表中的資料會全部查詢出來,而b表中相匹配的也會出來如果沒有匹配的用null填充。a表在前b表在後。如果a b反過來,也是同樣道理。當使用right join select from ...
自然連線,外連線,左外連線,右外連線
1.自然連線 結果基於表r和s的笛卡爾乘積,取對應的r和s中相同屬性組都相同的值,同時相同屬性組只保留乙個 先來看圖示,2個表以及自然連線的結果 操作的步驟 1.1找出2個表中相同的屬性組 屬性a加上屬性b 1.2找相同屬性組中,相同的屬性值所對應的元組 相同的屬性值 1.2.相同屬性值對應的元組 ...
左連線 左外連線 右外連線
在之前,我對mssql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下sql的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對sql的連線語句不太理解的朋友能夠有所幫助。發這麼菜的教程,各位大大們別笑話偶了,呵 d 有兩個表a和表b。表a結構如下 a...