如何重写这个:
select tab1.id, tab2.id, tab3.id
from tab1, tab2, tab3
where tab1.col1 = tab2.col1(+) and tab2.col2 = tab3.col2(+);
Run Code Online (Sandbox Code Playgroud)
使用OUTER JOIN语法?
我遇到了用于显示自定义配置文件字段和任何(可选)相应值的SQL查询的问题.
这是我正在使用的SQL查询:
SELECT pf.`id`, pf.`name`, pv.`value` FROM `profile_fields` AS pf
LEFT JOIN `profile_values` AS pv ON (pf.`id` = pv.`field_id`)
WHERE (pf.`site_id` = '0' OR pf.`site_id` = '%d') AND (pv.`user_id` = '%d' OR pv.`user_id` IS NULL)
ORDER BY pf.`order` ASC
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,任何没有相应profile_values记录的列都不显示,只显示它们,但只显示空值.
非常感谢!
我有一个名为gallery的表.对于图库中的每一行,表格图片中有几行.一张图片属于一个图库.然后是表投票.每一行都是某个画廊的upvote或downvote.这是(简化)结构:
gallery ( gallery_id )
picture ( picture_id, picture_gallery_ref )
vote ( vote_id, vote_value, vote_gallery_ref )
Run Code Online (Sandbox Code Playgroud)
现在我想要一个查询给我以下信息:所有画廊都有自己的数据字段和连接到画廊的图片数量以及投票的sumarized值.
这是我的查询,但由于多次加入,聚合值不正确.(至少当图片或投票中有多行时.)
SELECT
*, SUM( vote_value ) as score, COUNT( picture_id ) AS pictures
FROM
gallery
LEFT JOIN
vote
ON gallery_id = vote_gallery_ref
LEFT JOIN
picture
ON gallery_id = picture_gallery_ref
GROUP BY gallery_id
Run Code Online (Sandbox Code Playgroud)
因为我注意到这COUNT( DISTINCT picture_id )给了我正确数量的照片我试过这个:
( SUM( vote_value ) / GREATEST( COUNT( DISTINCT picture_id ), 1 ) ) AS score
Run Code Online (Sandbox Code Playgroud)
它适用于此示例,但如果一个查询中有更多连接,该怎么办?
只是想知道是否有更好或更"优雅"的方式可以解决这个问题.另外我想知道我的解决方案是MySQL特定的还是标准的SQL?
我有一个包含50个参数的SQL查询,例如这个.
DECLARE
@p0 int, @p1 int, @p2 int, (text omitted), @p49 int
SELECT
@p0=111227, @p1=146599, @p2=98917, (text omitted), @p49=125319
--
SELECT
[t0].[CustomerID], [t0].[Amount],
[t0].[OrderID], [t0].[InvoiceNumber]
FROM [dbo].[Orders] AS [t0]
WHERE ([t0].[CustomerID]) IN
(@p0, @p1, @p2, (text omitted), @p49)
Run Code Online (Sandbox Code Playgroud)
估计的执行计划显示数据库将收集这些参数,对它们进行排序,然后从最小参数读取索引Orders.CustomerID 到最大值,然后对记录的其余部分执行书签查找.
问题是,最小和最大的参数可能相距很远,这将导致可能读取整个索引.
由于这是在客户端的循环中完成的(每次发送50个参数,1000次迭代),这是一个糟糕的情况.如何在不重复索引扫描的情况下制定查询/客户端代码以获取我的数据,同时保持往返次数减少?
我考虑订购50k参数,以便发生较小的索引读数.有一个可怕的缓解情况阻止了这一点 - 我不能使用这个解决方案.为了模拟这种情况,假设我在任何时候只有50个id可用,并且无法控制它们在全局列表中的相对位置.
我们正在探索在两个不同的SQL Server实例之间进行通信的不同方法.其中一个理想的工作流程是向"远程"侧发送某种消息,请求删除记录.当该系统完成删除时,它保持其事务处于打开状态并将响应发送回启动器,然后启动器删除其相应的记录,提交其事务,然后将消息发送回"远程"端,告诉它,最后,同时提交删除.
这是一个穷人近似的两阶段提交.关于SQL Server Service Broker是否可以合理地干净地处理这种类型的场景,该部门正在进行宗教辩论.任何人都可以了解它是否可以吗?有类似工作流程的经验吗?考虑到SQL Server实例位于单独的非域计算机上,是否有更好的机制我应该考虑实现这一点?
编辑:为了澄清,我们不能使用分布式事务,因为网络安全性既紧凑又有些随意.我们不允许进行可能的配置.
我有关于char ptr输出的问题.以下是我试图执行的示例代码..
struct DeviceInfo{
char * name;
int id;
};
void testFunc(DeviceInfo *info){
char temp[50] = "test input";
info->name = temp;
}
void main(){
DeviceInfo deviceInfo;
testFunc(&deviceInfo);
std::cout<<"Output is "<<deviceInfo.name;
}
Run Code Online (Sandbox Code Playgroud)
输入我得到的主要是某种奇怪的....在调试时我发现当"test.name"传递给输出流时,它不仅提供垃圾输出,而且还改变了"名称"值"deviceInfo"对象为该垃圾值...这是一种测试场景,但在实际应用中,这个testFunc必须以相同的方式执行,即常量char字符串应该被赋予char ptr的名称.
我试着把'\ 0'放在char temp的末尾,就像这个temp [strlen(temp)] ='\ 0';
但它仍然无法正常工作
任何帮助表示赞赏......
拉扎
我们已经为我们的应用程序实现了SSB消息传递解决方案,但现在正在遇到扩展问题.任何具有SSB应用程序扩展经验的人都能提出任何关于我们可能做错的建议吗?
设置是我们使用单个启动器队列,该队列使用激活的过程为单个目标队列提供信息.激活的过程处理接收的消息,并选择性地将它们分派给已注册相关类型消息的客户端.
此第二阶段调度再次使用单个引导程序队列(不同于用于初始消息注入的队列),并将消息发送到确定为适当的任意数量的客户端队列.
每个客户端对数据库执行操作,创建发送到所有其他客户端的消息,因此这是一个N ^ 2扩展问题.对于相对较少数量的客户端(10个或更少),这对我们来说不构成问题,但是当我们扩展到N = 35或N = 40范围时,我们开始将消息排队比我们处理它们的速度更快指向工作流程,我们开始遇到严重的延迟问题.我们失败的负载仍然在SSB实现的最佳情况下报告,所以我确信我们的实现存在缺陷.
相关诊断包括:
如果有其他诊断对任何可能了解我们可以采取哪些措施加速配置的人有帮助,我可能会找到它们.
我有一个这种类型的设置数据表.
表A.
AID AName
---------------------
1 A_Name1
2 A_Name2
3 A_Name3
Run Code Online (Sandbox Code Playgroud)
表B.
BID BName
---------------------
10 B_Name1
20 B_Name2
30 B_Name3
Run Code Online (Sandbox Code Playgroud)
表C.
AID BID
---------------------
1 10
2 10
2 20
2 30
3 20
3 30
Run Code Online (Sandbox Code Playgroud)
我想使用LINQ编写一个查询,对于给定的A的ID,我给出了不在表C中的B列表.
因此,对于1的AID,我希望BID为20和30.
对于AID为3,我希望BID为10
对于2的AID,没有任何返回任何返回.
我知道SQL会
SELECT
B.BID
FROM B
LEFT OUTER JOIN C ON C.BID = B.BID AND A.AID = 1
-- AID would change based on which I was looking for, 1, 2, or 3
Run Code Online (Sandbox Code Playgroud)
什么是LINQ等效?
请假设我有相应的A,B和C表的对象.
我知道你可以做到这一点,因为我之前已经看过它,但我忘记了到现在为止我不需要这样做.
我有一个名为Employees的表,它有各种员工数据(duh).我需要一个查询,它将对表中所有行的名字和姓氏进行选择,然后将它们全部置于逗号分隔的字符串中.
例如,我有几行(比实际上要多得多,但为了这个问题,假设有两个)数据看起来像:
FName LName ------- ----- Richard Prescott Jill Sentieri Carol Winger
我需要一个能够以这种形式返回上述数据的选择:
Richard Prescott, Jill Sentieri, Carol Winger
预先感谢您的帮助!
<>在SQL语句中使用不等号的糟糕编程习惯吗?
我在表列类型中有三个值.值可以是0,1或2.哪个SQL语句更好?
1)WHERE类型<> 2
2)WHERE类型(0,1)
sql ×4
sql-server ×4
join ×2
.net ×1
aggregation ×1
c++ ×1
char ×1
indexing ×1
left-join ×1
linq-to-sql ×1
mysql ×1
optimization ×1
oracle ×1
outer-join ×1
performance ×1
select ×1
t-sql ×1
transactions ×1