以下语句给出相同的结果(一个使用on,另一个使用where):
mysql> select * from gifts INNER JOIN sentGifts ON gifts.giftID = sentGifts.giftID;
mysql> select * from gifts INNER JOIN sentGifts WHERE gifts.giftID = sentGifts.giftID;
Run Code Online (Sandbox Code Playgroud)
我只能在左外连接的情况下看到"无与伦比"的案例:(
找出任何人从未发过的礼物)
mysql> select name from gifts LEFT OUTER JOIN sentgifts
ON gifts.giftID = sentgifts.giftID
WHERE sentgifts.giftID IS NULL;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它首先使用on,然后where.是否on先做匹配,然后where做"辅助"过滤?或者是否有更一般的使用on对比规则where?谢谢.
正如标题所示,我正在寻找一种方法来将where子句与include结合使用.
这是我的情况:我负责支持一个充满代码味道的大型应用程序.更改过多代码会导致各处出现错误,因此我正在寻找最安全的解决方案.
假设我有一个对象总线和一个对象People(Bus有一个导航道具Collection of People).在我的查询中,我需要选择只有醒着的乘客的所有公共汽车.这是一个简单的虚拟示例
在当前的代码中:
var busses = Context.Busses.Where(b=>b.IsDriving == true);
foreach(var bus in busses)
{
var passengers = Context.People.Where(p=>p.BusId == bus.Id && p.Awake == true);
foreach(var person in passengers)
{
bus.Passengers.Add(person);
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码之后,处理Context,并且在调用方法中,生成的Bus实体被映射到DTO类(实体的100%副本).
此代码导致多次调用DB,这是一个禁止,所以我在MSDN博客上找到了这个解决方案
这在调试结果时效果很好,但是当实体映射到DTO时(使用AutoMapper),我得到一个异常,即Context/Connection已经关闭并且无法加载该对象.(上下文总是关闭不能改变这个:()
所以我需要确保已经加载了Selected Passengers(导航属性上的IsLoaded也是False).如果我检查Passengers集合,Count也会抛出Exception,但是在Passegers集合中还有一个名为"包装相关实体"的集合,其中包含我的过滤对象.
有没有办法将这些包装的相关实体加载到整个集合中?(我无法更改automapper mapping配置,因为它在整个应用程序中使用).
有没有其他方式来获得活跃的乘客?
任何提示都是受欢迎的......
Gert Arnold的答案不起作用,因为数据未被急切加载.但是当我简化它并删除它的加载位置时.这真是奇怪,因为执行sql在两种情况下都返回所有乘客.因此,将结果放回实体时一定存在问题.
Context.Configuration.LazyLoadingEnabled = false;
var buses = Context.Busses.Where(b => b.IsDriving)
.Select(b => new
{
b,
Passengers = b.Passengers
})
.ToList()
.Select(x => x.b)
.ToList();
Run Code Online (Sandbox Code Playgroud)
经过很多努力,格特阿诺德的答案奏效了!正如Gert Arnold建议您需要禁用延迟加载并将其保持关闭状态.这将要求对应用程序进行一些额外的更改,因为上一代开发人员喜欢Lazy Loading -_-
是否有可能在另一个地方使用'where'关键字然后转换?我可以在for循环中使用它吗?
我有一个bools数组,都有一个值,我可以做这样的事情:
var boolArray: [Bool] = []
//(...) set values and do stuff
for value where value == true in boolArray {
doSomething()
}
Run Code Online (Sandbox Code Playgroud)
这比使用if要好得多,所以我想知道是否有可能在for循环中使用where.Ty适合你的时间.
在WHERE子句中包含输入参数的最佳方法是什么,但如果它为null则将其排除?
我相信有很多方法,但我似乎无法记住.
我也可以使用COALESCE()?但我认为这仅适用于SELECTing值?
为了澄清,让我们说一个变量,@code ="1"然后我会在哪里,Where type='B' AND code = @code但如果@code is null那时我只想要Where type='B'- 注意缺失code = @code.
我在应用程序的日志文件中看到了一个查询.它包含一个类似的查询:
SELECT ID FROM CUST_ATTR49 WHERE 1=0
Run Code Online (Sandbox Code Playgroud)
这样一个查询的用途是什么,必然会返回什么?
搜索产品列表时,@SearchType参数是可选的.如果@SearchType是空的,NULL那么它应该返回所有产品而不使用该WHERE子句.否则,如果它通过Equipment它然后将使用它.
ALTER PROCEDURE [dbo].[psProducts]
(@SearchType varchar(50))
AS
BEGIN
SET NOCOUNT ON;
SELECT
P.[ProductId],
P.[ProductName],
P.[ProductPrice],
P.[Type]
FROM [Product] P
-- if @Searchtype is not null then use the where clause
WHERE p.[Type] = @SearchType
END
Run Code Online (Sandbox Code Playgroud) 我在这里阅读了一些帖子,似乎没什么特别的,但我还是不能选择最后几天的条目.
SELECT
p1.kArtikel,
p1.cName,
p1.cKurzBeschreibung,
p1.dLetzteAktualisierung,
p1.dErstellt,
p1.cSeo,
p2.kartikelpict,
p2.nNr,
p2.cPfad
FROM
tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
INNER JOIN
tartikelpict AS p2
ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1)
ORDER BY
p1.kArtikel DESC
LIMIT
100;', $connection);
Run Code Online (Sandbox Code Playgroud)
如果我在今天和过去7天之间添加,我的代码将不会输出任何内容.
这是我的代码:
SELECT table1.f_id FROM table1 WHERE table1.f_com_id = '430' AND
table1.f_status = 'Submitted'
INNER JOIN table2
ON table2.f_id = table1.f_id
where table2.f_type = 'InProcess'
Run Code Online (Sandbox Code Playgroud)
我需要信息来自table1与f_com_id430 相关联的所有id 和提交的状态,并且该类型应仅在存储在其他表(table2)中的进程中
f_id是p_key和f_key在两个表中.
但这给了我错误,我认为我把这个WHERE条款写错了,如何修复它.
错误消息:#1064 - 您的SQL语法出错; 检查与MySQL服务器版本对应的手册,以便在第2行的'INNER JOIN table2 ON table2.f_id ='附近使用正确的语法
我是VB.NET的新手,我在这里遇到一些麻烦,我觉得应该很简单.
保持简单,假设我有一个带有"Name"的Document表,我想搜索(实际上还有其他几个表,连接等等).我需要能够使用where基于传入的字符串值的子句构建查询.
示例 - 用户可以传入"ABC","ABC DEF","ABC DEF GHI".
最后的查询是(语法不正确,我知道):
Select * from Documents Where Name Like %ABC% AND Name Like %DEF% AND Name like %GHI%
Run Code Online (Sandbox Code Playgroud)
所以,我以为我可以这样做.
Dim query = From document In _context.Documents
<< loop based on number of strings passed in >>
query = query.Where( ... what goes here?? )
Run Code Online (Sandbox Code Playgroud)
出于某种原因,脑死亡或其他什么,我无法弄清楚如何在VB.NET中完成这项工作,或者我是否正确地做到了.
在这里找到了几个类似的问题,但无法弄清楚如何应用于我的场景.
我的函数有一个名为@IncludeBelow的参数.值为0或1(BIT).
我有这个问题:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = @Value1
AND l.SomeOtherCondition = @SomeOtherValue
Run Code Online (Sandbox Code Playgroud)
如果@IncludeBelow为0,我需要查询为:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = @Value1
AND l.SomeOtherCondition = @SomeOtherValue
AND p.LocationType = @LocationType -- additional filter to only include level.
Run Code Online (Sandbox Code Playgroud)
如果@IncludeBelow为1,则需要排除最后一行.(即不要应用过滤器).
我猜它需要是一个CASE声明,但无法弄清楚语法.
这是我尝试过的:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = …Run Code Online (Sandbox Code Playgroud) where-clause ×10
sql ×6
mysql ×3
sql-server ×3
c# ×1
coalesce ×1
database ×1
for-in-loop ×1
for-loop ×1
if-statement ×1
include ×1
join ×1
linq ×1
null ×1
swift ×1
t-sql ×1
vb.net ×1
where ×1