从sql走向linq的我撞死在起点上
【本文纯个人理解,错误轻喷,非常希望能有大神指点】
A left (outer) join B on A.bid=B.id 上面这句话叫做左连接,原因是left(左)join(加入,连入)被译为左连接,所以,这是关于语法中关键字的翻译,而非连接原理,造成不能以为是从第一张表的左边连接。相反,它是从A表的右边开始连接的。原因很简单,比如一个普通的查询语句:select t.id TID from table1 t。后面的那个t是对table1的标记,再看TID它也是对t.id的标记,它们的功能是什么我们暂且不说,起码我们知道了sql的语法习惯是将附加的参数或者说明后置。这样我就再看上面的左连语句,就知道了left和join屁关系没有。语句的划分应该是:select A.* from A left join B on A.bid=B.id。outer没写,是因为所有的left join都是left outer join,right join类推!回到我们刚刚的那个语法,红色的部分代表了整个语句的操作及限定关键字,而left则是A的后置附加信息,它的意思是说,A是放在左边的,同样,你若把left换成Right就成了A放在右边,而如果后面加了Outer了呢,outer和join对是一对,他俩与inner join相对应,这下就好理解了,因为inner join将两张表里面所有的为空的记录都弃掉,所以,不需要哪个是左哪个是右,所以,A表后面的left或者right就被省略了,直接是A inner join B on。话说回来了,为什么要分左边呢?很简单,我们画表喜欢从左往右,左边定下了,再画右边,也就是,先把左边的表查出来,再把右边的取出来往上面拼,能拼多少拼多少。 【linq中的左右内连接】linq的lambda | 生成的sql |
var queryLeft = from t in con.TRANSSECTION_BASEPRICE join u in con.SYS_STAFF on t.INPUT_MAN equals u.CODEUSER into TranNew from tr in TranNew.DefaultIfEmpty() select new { t.DEST_PLACE, t.IF_VALID, t.INFO_ID, t.INPUT_TIME, INPUTMAN =tr==null?t.INPUT_MAN: tr.USERNAME }; | SELECT 1 AS "C1", "Extent1"."DEST_PLACE" AS "DEST_PLACE", "Extent1"."IF_VALID" AS "IF_VALID", "Extent1"."INFO_ID" AS "INFO_ID", "Extent1"."INPUT_TIME" AS "INPUT_TIME", CASE WHEN ("Extent2"."ID" IS NULL) THEN "Extent1"."INPUT_MAN" ELSE "Extent2"."USERNAME" END AS "C2" FROM "JSXW"."TRANSSECTION_BASEPRICE" "Extent1" LEFT OUTER JOIN "JSXW"."SYS_STAFF" "Extent2" ON ("Extent1"."INPUT_MAN" = "Extent2"."CODEUSER") OR (("Extent1"."INPUT_MAN" IS NULL) AND ("Extent2"."CODEUSER" IS NULL)) |
var queryRight = from u in con.SYS_STAFF join t in con.TRANSSECTION_BASEPRICE on u.CODEUSER equals t.INPUT_MAN into unew from un in unew.DefaultIfEmpty() select new { un.DEST_PLACE, un.IF_VALID, un.INFO_ID, un.INPUT_TIME, INPUTMAN = u.USERNAME }; | SELECT 1 AS "C1", "Extent2"."DEST_PLACE" AS "DEST_PLACE", "Extent2"."IF_VALID" AS "IF_VALID", "Extent2"."INFO_ID" AS "INFO_ID", "Extent2"."INPUT_TIME" AS "INPUT_TIME", "Extent1"."USERNAME" AS "USERNAME" FROM "JSXW"."SYS_STAFF" "Extent1" LEFT OUTER JOIN "JSXW"."TRANSSECTION_BASEPRICE" "Extent2" ON ("Extent1"."CODEUSER" = "Extent2"."INPUT_MAN") OR (("Extent1"."CODEUSER" IS NULL) AND ("Extent2"."INPUT_MAN" IS NULL)) |
var queryInner = from t in con.TRANSSECTION_BASEPRICE join u in con.SYS_STAFF on t.INPUT_MAN equals u.CODEUSER select new { t.DEST_PLACE, t.IF_VALID, t.INFO_ID, t.INPUT_TIME, INPUTMAN = u.USERNAME }; | SELECT 1 AS "C1", "Extent1"."DEST_PLACE" AS "DEST_PLACE", "Extent1"."IF_VALID" AS "IF_VALID", "Extent1"."INFO_ID" AS "INFO_ID", "Extent1"."INPUT_TIME" AS "INPUT_TIME", "Extent2"."USERNAME" AS "USERNAME" FROM "JSXW"."TRANSSECTION_BASEPRICE" "Extent1" INNER JOIN "JSXW"."SYS_STAFF" "Extent2" ON ("Extent1"."INPUT_MAN" = "Extent2"."CODEUSER") OR (("Extent1"."INPUT_MAN" IS NULL) AND ("Extent2"."CODEUSER" IS NULL)) |