我知道SQL Server中的连接.
例如.Table1,Table2有两个表.
他们的桌子结构如下.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Run Code Online (Sandbox Code Playgroud)
表1数据如下:
Id Name
-------------
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
表2数据如下:
Id Name
-------------
1 A
2 B
3 C
Run Code Online (Sandbox Code Playgroud)
如果我执行下面提到的两个SQL语句,则两个输出都是相同的
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)
请解释上述SQL语句中左右连接的区别.
是否可以在没有ON语句的情况下编写连接查询?以及这些联接如何LEFT JOIN, RIGHT JOIN起作用.
结果有什么不同:
你能通过一些例子解释一下吗?
维基百科说:
"在实践中,很少使用明确的右外连接,因为它们总是可以用左外连接替换,并且不提供额外的功能."
任何人都可以提供他们更喜欢使用正确表示法的情况,为什么?我想不出使用它的理由.对我来说,它永远不会让事情更清楚.
编辑:我是甲骨文老将制作新年决议,以便从(+)语法中脱离自己.我想做得对
快速问题
是否有更好的(即更有效/更简洁)的方法来做到这一点?
compare-object $a $b | ?{$_.SideIndicator -eq '<='}
Run Code Online (Sandbox Code Playgroud)
详情
Compare-Object给出参数-excludeDifferent并-includeEqual允许您修改得到的结果.
-includeEqual给你一个完整的外部联接-excludeDifferent毫无意义; 因为默认情况下会排除相等的项目,因此它现在将排除所有内容.有对没有选项-includeLeft,-excludeLeft或类似的.
目前要做右侧为空的左外连接(即参考对象中不在差异对象中的项目)我需要手动过滤结果,如上面的代码所示.
我错过了什么/有更好的方法吗?
在外连接上(在这种情况下让我们采用左外连接)如何在右侧表上添加过滤器?
SELECT s.id, i.name FROM Student s
LEFT OUTER JOIN Student_Instructor i
ON s.student_id=i.student_id
AND i.name='John'
Run Code Online (Sandbox Code Playgroud)
我理解如果过滤器在Student桌面上,它将更像是"首先获取名称= John的所有行并加入表格".
但是我不确定如果过滤器在右侧的表(Student_Instructor)上是否是这种情况.如何i.name='John'解释过滤器?
谢谢
这是我的模型
class Student:
user = ForeignKey(User)
department = IntegerField()
semester = IntegerField()
...
class Attendance:
student = ForeignKey(Student)
subject = ForeignKey(Subject)
month = IntegerField()
year = IntergerField()
present = IntegerField()
total = IntegerField()
students = Student.objects.filter(semester=semester)
Run Code Online (Sandbox Code Playgroud)
如何在Student和Attendance模型之间执行正确的连接,以便我可以获得包含所有students和出勤率的查询集,如果存在,则为学生,否则为空?
文档提到了左连接但没有提到右连接。
经过搜索,我才知道 JPQL 中没有 Right Join。我看到有另一种方法可以使用 JPA 双向(不是右连接,而是使用 pojo 对象)来实现它,但是我在控制台中注意到一件事,它对数据库进行了多次调用,例如见下表。
Flat Table UserToFlat User
| Flat_ID | Flat No | | ID | Flat_ID | User_ID | | User_ID | Name |
| 1 | 101 | | 1 | 1 | 1 | | 1 | XYZ |
| 2 | 102 | | 2 | 2 | 2 | | 2 | PQR |
| 3 | 103 | | 3 | 3 | 3 | | 3 | …Run Code Online (Sandbox Code Playgroud) 我有两个MySql表如下:
resource
-----------------------------------------------
id name group owner_id
-----------------------------------------------
1 MyResource1 hs 11
2 MyResource2 ms 24
3 MyResource3 ps 11
...
resource_access
-----------------------------------------------
id resource_id user_id
-----------------------------------------------
1 1 12
2 2 24
3 2 11
4 3 15
...
Run Code Online (Sandbox Code Playgroud)
现在,第一个表是资源列表,当然还有owner_id列中的各自所有者.第二个表是与另一个用户"共享"此资源的结果.该表resource_access 可能包含一个记录,其中的记录user_id等同于所有者交换中清理清理owner_id的行中的记录resource_access.
我只想获取用户有权访问的任何资源的ID,名称和组,无论他们是所有者还是已经与他们共享.这是我对示例用户的MySQL查询(24):
SELECT resource.id, resource.name, resource.group
FROM `resource`
INNER JOIN resource_access ON (
resource.owner_id='24'
OR (
resource_access.user_id='24' AND
resource_access.resource_id=resource.id
)
)
Run Code Online (Sandbox Code Playgroud)
眼下,它返回id,name以及group资源2号多次(如十二)个.有可能的原因吗?我尝试过LEFT …
我听说有3种类型的连接
我不确定确切的名字.谷歌搜索出现了各种各样的术语,如:
交叉连接,左连接,右连接,内连接,外连接,自连接....
任何人都可以告诉我总共有多少连接存在于MySQL中.
我有一张看起来像这样的表:
+-----------+--------+------------+ | member_id | 姓名 | 合作伙伴_id | +-----------+--------+------------+ | 1 | 约翰 | 2 | | 2 | 伊娃 | 1 | | 3 | 彼得 | 4 | | 4 | 米娅 | 3 | | 5 | 瑞秋 | 空| +-----------+--------+------------+
我想显示成员名称及其合作伙伴的名称。我还需要显示没有成员的成员。但是,这就是我使用 RIGTH JOIN 时得到的结果:
SELECT m1.name, m2.name
FROM members m1
RIGHT JOIN members m2 ON m1.member_id=m2.partner_id
Run Code Online (Sandbox Code Playgroud)
+--------+--------------+ | 姓名 | 合作伙伴姓名 | +--------+--------------+ | 约翰 | 伊娃 | | 伊娃 | 约翰 | | 彼得 …
这两个FROM子句会产生相同的结果吗?如果没有,有没有办法写第一个,所以不需要括号?
FROM SALESTAX
RIGHT JOIN ( ITEMS
RIGHT JOIN ( PINVOICE
INNER JOIN PINVDET ON PINVOICE.PNV_INVOICENO = PINVDET.PND_INVOICENO AND PINVOICE.PNV_Site = PINVDET.PND_Site
) ON ITEMS.ITE_INVNO = PINVDET.PND_INVNO
) ON SALESTAX.STX_GroupID = PINVDET.PND_TAX1
FULL JOIN ( CUSTMS
RIGHT JOIN CUSMER ON CUSTMS.TMS_CODE = CUSMER.CUS_TERM
) ON PINVDET.PND_CUSTID = CUSMER.CUS_CustID
FROM CUSTMS RIGHT JOIN
CUSMER ON TMS_CODE = CUS_TERM FULL JOIN
PINVDET ON PND_CUSTID = CUS_CustID LEFT JOIN
PINVOICE ON PNV_INVOICENO = PND_INVOICENO AND PNV_Site = PND_Site LEFT JOIN
SALESTAX on STX_GROUPID …Run Code Online (Sandbox Code Playgroud) right-join ×12
left-join ×8
sql ×7
join ×5
mysql ×3
inner-join ×2
sql-server ×2
database ×1
diff ×1
django ×1
hibernate ×1
jpa-2.0 ×1
jpql ×1
orm ×1
outer-join ×1
php ×1
powershell ×1