在使用实体框架时,我已阅读了与在Linq to Entities(.NET 3.5)中实现等效的LEFT OUTER JOIN相关的所有帖子,但尚未找到解决以下问题的方法.
给出两个表,由下面的对象表示:
public class Foo
{
public int FooId; // primary key
public string Name;
}
public class Bar
{
public int BarId; // primary key
public int FooId; // foreign key
public string Desc;
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个Linq to Entities语句,它是以下SQL语句的EQUIVALENT.请注意,WHERE语句包含两个OR'd条件,这两个条件跨越两个表,并使用DISTINCT限定符.
SELECT DISTINCT
Foo.*
FROM
Foo
LEFT OUTER JOIN Bar ON Foo.FooId = Bar.FooId
WHERE
(Foo.Name = 'fooname' OR Bar.Desc = 'bardesc')
Run Code Online (Sandbox Code Playgroud)
我生成的Linq查询是通过实体框架实现的Linq到实体,并且(希望)生成一个要在服务器上执行的SQL语句.Linq to Entities不支持FirstOrDefault()扩展子句,因此LEFT OUTER JOIN的标准Linq语法将不起作用.
这是我的解决方案,但我无法做到以下任何一种情况:
1)生成一个结果集,其中包含由LEFT OUTER JOIN操作返回的一组Foo/Bar组合.
2)实现WHERE子句的等价物: WHERE (Foo.Name = 'fooname' OR …
我有一个SQL Server 2008数据库.该数据库有三个表:
人
- Id
- FullName
- MembershipStatusId (nullable)
- HairStyleId (nullable)
Run Code Online (Sandbox Code Playgroud)
MembershipStatus
- Id
- Name
Run Code Online (Sandbox Code Playgroud)
发型
- Id
- ColorName
- Description
Run Code Online (Sandbox Code Playgroud)
我需要创建一个列出数据库中所有人的查询.因为MembershipStatusId并且HairStyleId都可以为空,我知道我需要做一个左外连接.但是,因为有多个表,我不知道该怎么做.只有一个左外连接,我知道我可以这样做:
SELECT
p.*,
m.Name as 'MembershipStatus',
-- how do i include the person's hair color as part of my result set?
FROM
Person p LEFT OUTER JOIN
MembershipStatus m ON p.[MembershipStatusId]
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何为发型名称添加左外连接.有人可以告诉我如何包含人的头发颜色?
谢谢!
我正在使用Oracle SQL,因此外连接具有良好的(+)语法.我应该警告你,我不能重新设计数据库; 我在一个大型组织工作.
以下是一些示例表:
People
PersonID Name
1 Elmo
2 Oscar
3 Chris
Attribute
PersonID Attribute
1 Happy
1 Muppet
1 Popular
2 Grouchy
2 Muppet
2 Popular
3 Programmer
Run Code Online (Sandbox Code Playgroud)
我想要一份人员名单,我想知道我们是否知道他们是幸福或不高兴.以下是我想要的输出:
Name Mood
Elmo Happy
Oscar Grouchy
Chris
Run Code Online (Sandbox Code Playgroud)
所以这是我认为我会使用的查询:
SELECT p.Name, a.Attribute
FROM People p, Attributes a
WHERE p.PersonID = a.PersonID (+)
AND ( a.Attribute (+) = 'Happy'
OR a.Attribute (+) = 'Grouchy' )
Run Code Online (Sandbox Code Playgroud)
(也许我必须把"OR a.Attribute IS NULL"或其他东西.)
但实际上我根本不允许在外连接中使用OR!我该怎么办呢?
你知道如何用外连接连接两个表吗?知道在SQL中这样做,但我现在需要Excel.
我有一个列中的所有员工列表,我有一个每个员工的任务表.我想创建一个函数,它将填充缺少员工的表.
表1 - 所有员工的列表
Fernando Hector Vivian Ivan
表2 - 实际任务列表
Fernando, task A, 5 hours Vivian, task B, 8 hours
结果我想实现
Fernando, task A, 5 hours Vivian, task B, 8 hours Hector, , 0 hours Ivan, , 0 hours
非常感谢任何想法.
我们有一张叫做的桌子Student.该表有一个名为的字段Homeroom,其中值是学生教室的房间号.该值可以为null.
我们有一个名为的第二个表Staff.该表还有一个字段,Homeroom用于指示教师分配到哪个教室.该值可以为null.
但是当学生Homeroom为空时,Staff不应返回记录.
我们曾经利用这样的事实:检查两个空字段的相等性总是在SQL中返回false.通过SQL,这就是我们获取所需数据的方式:
SELECT STUDENT.ID, STAFF.NAME as [Homeroom Teacher]
FROM STUDENT
LEFT OUTER JOIN STAFF ON
STAFF.BUILDING = STUDENT.BUILDING AND
STAFF.HOMEROOM = STUDENT.HOMEROOM
Run Code Online (Sandbox Code Playgroud)
学生将被退回,但没有老师.
我们正在使用Entity Framework和Code First POCO对象.所以,我们有一个Student对象和一个Staff对象.当我们在LINQ中重新创建此SQL时:
from student in repo.GetStudents()
join homeroomTeacher in repo.GetStaff()
new { student.Building, Room = student.Homeroom }
equals new { homeroomTeacher.Building, Room = homeroomTeacher.Homeroom }
into roj2
from homeroomTeacherRoj in roj2.DefaultIfEmpty()
select student.Id, homeroomTeacherRoj.Name;
Run Code Online (Sandbox Code Playgroud)
生成的SQL包含两个Homeroom字段的NULL检查:
SELECT STUDENT.ID, STAFF.NAME
FROM STUDENT AS …Run Code Online (Sandbox Code Playgroud) sql linq-to-entities entity-framework outer-join ef-code-first
这是我的代码:
Table('contacts', self.metadata,
Column('id', PGUuid, primary_key=True),
Column('first_name', String(150), nullable=False),
Column('middle_name', String(150), nullable=True),
Column('last_name', String(150), nullable=False, index=True),
Column('friendly_name', String(150), nullable=True),
Column('alias', String(450), nullable=False, index=True),
Column('prefix', String(5), nullable=True),
Column('suffix', String(5), nullable=True),
Column('ssn', String(12), nullable=True),
Column('email', String(150), nullable=True),
Column('date_of_birth', Date, nullable=True),
Column('contact_type', String(16), nullable=False))
self._contacts_addresses_table = Table('contacts_addresses', self.metadata,
Column('contact_id', PGUuid, ForeignKey('contacts.id'),
primary_key=True, index=True),
Column('address_id', PGUuid, ForeignKey('addresses.id'),
primary_key=True, index=True))
self._contacts_phones_table = Table('contacts_phones', self.metadata,
Column('contact_id', PGUuid, ForeignKey('contacts.id'),
primary_key=True, index=True),
Column('phone_id', PGUuid, ForeignKey('phones.id'),
primary_key=True, index=True))
self._contacts_notes_table = Table('contacts_notes', self.metadata,
Column('contact_id', PGUuid, ForeignKey('contacts.id'),
primary_key=True, index=True),
Column('note_id', PGUuid, …Run Code Online (Sandbox Code Playgroud) 我有一个清单,比如说exm = list( elm1=c('a', 'b'), elm2=c('b', 'c', 'd'), elm3=c('b', 'c', 'd', 'e'))。我想对来自 的两个元素的每个组合应用一个函数exm,例如,length( intersect( exm$elm1, exm$elm2 ) )。结果应该是一个对称矩阵。该函数outer似乎可以完成这项工作,但它仅适用于向量,而不适用于列表。有什么想法可以这样做吗?
以下是架构
+---------+---------+
| Employee Table |
+---------+---------+
| EmpId | Name |
+---------+---------+
| 1 | John |
| 2 | Lisa |
| 3 | Mike |
| | |
+---------+---------+
+---------+-----------------+
| Family Table |
+---------+-----------------+
| EmpId | Relationship |
+---------+-----------------+
| 1 | Father |
| 1 | Mother |
| 1 | Wife |
| 2 | Husband |
| 2 | Child |
+---------+-----------------+
+---------+---------+
| Loan Table |
+---------+--------+
| LoanId | EmpId …Run Code Online (Sandbox Code Playgroud) 最初,我尝试进行“右外部联接”,但是一旦发现不被支持,我便开始着手从左侧来。但是,我在弄清楚如何编写所需的内容时遇到了麻烦。本质上,我有两个表,Table_1并且Table_2需要Table_1where column_c等于的所有行1。此外,我需要所有的行Table_2,其中column_b是不是已经在Table 1。看起来像这样:
**Table_1**
column_a ( a and b are the
column_b ( primary key.
column_c
**Table_2**
column_b
Run Code Online (Sandbox Code Playgroud)
这就是我用SQL编写的方式:
SELECT *
FROM (SELECT * FROM Table_1 WHERE column_a = 123) t1
RIGHT OUTER JOIN Table_2 t2 ON t1.column_b = t2.column_b
WHERE t1.column_c = 1 or t1.column_c is NULL;
SELECT *
FROM Table_2 t2
LEFT OUTER JOIN (SELECT * FROM Table_1 WHERE column_a = 123) t1 …Run Code Online (Sandbox Code Playgroud) 我在工作中重构一些sql,偶然发现了一些我不确定如何解释的东西.我认为有两个查询会产生相同的结果,但不会,我不知道为什么.
查询如下:
select *
from TableA as a
left join TableB b on a.id = b.id and b.status in (10, 100)
select *
from TableA as a
left join TableB b on a.id = b.id
where b.status is null or b.status in (10, 100)
Run Code Online (Sandbox Code Playgroud)
什么时候这些不会返回相同的结果?
outer-join ×10
sql ×4
t-sql ×2
excel ×1
flask ×1
join ×1
left-join ×1
many-to-many ×1
mysql ×1
oracle ×1
python ×1
python-3.x ×1
r ×1
sql-server ×1
sqlalchemy ×1