我有三张桌子.
地点
ID | NAME | TYPE |
1 | add1 | stat |
2 | add2 | coun |
3 | add3 | coun |
4 | add4 | coun |
5 | add5 | stat |
Run Code Online (Sandbox Code Playgroud)
学校
ID | NAME
1 | sch1
2 | sch2
3 |sch3
Run Code Online (Sandbox Code Playgroud)
school_locations
ID |LOCATIONS_ID |SCHOOL_ID
1 | 1 |1
2 | 2 |2
3 | 3 |3
Run Code Online (Sandbox Code Playgroud)
这里的表位置包含应用程序的所有位置.学校的位置由ID调用.
当我使用查询
select locations.name from locations where type="coun";
Run Code Online (Sandbox Code Playgroud)
它显示类型为"coun"的名称
但是我想显示locations.name,其中只有school_locations有type ="coun"
我尝试了以下查询,但似乎都没有工作
select locations.name …Run Code Online (Sandbox Code Playgroud) 我想知道是否CROSS JOIN可以INNER JOIN在找到任何查询时安全地替换它.
是INNER JOIN没有ON或USING完全一样的CROSS JOIN?如果是,那么CROSS JOIN发明的类型只是为了在查询中更好地表达意图吗?
这个问题的附录是:
哪有用在使用现代化的和广泛使用的DBMS的不同CROSS JOIN ... WHERE x, INNER JOIN ... ON ( x )或INNER JOIN ... WHERE ( x )?
谢谢.
我想从内部联接的更多表中选择数据.
这些是我的表.
Student (studentId, firstName, lastname)
Exam (examId, name, date)
Grade (gradeId, fk_studentId, fk_examId, grade)
Run Code Online (Sandbox Code Playgroud)
我想写一份声明,说明学生去过的考试,成绩和日期.按日期排序.
这是我的发言.它运行,但我想确保我正确地做到了.
SELECT
student.firstname,
student.lastname,
exam.name,
exam.date,
grade.grade
FROM grade
INNER JOIN student
ON student.studentId = grade.gradeId
INNER JOIN exam
ON exam.examId = grade.gradeId
ORDER BY exam.date
Run Code Online (Sandbox Code Playgroud) 我的查询:
SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
history ON sites.siteName = history.siteName
ORDER BY siteName,date
Run Code Online (Sandbox Code Playgroud)
输出的第一部分:

如何删除siteName列中的重复项?我想只留下基于date列的更新版本.
在上面的示例输出中,我需要行1,3,6,10
我有两个大表,每个表有大约1亿条记录,我担心我需要在两者之间进行内部连接.现在,两张桌子都非常简单; 这是描述:
BioEntity表:
EGM表(一个辅助表,实际上是批量导入操作的结果):
我需要获得匹配的名称,以便将BioEntityId与驻留在EGM表中的PId相关联.最初,我尝试使用单个内连接执行所有操作,但查询似乎占用时间太长,数据库的日志文件(在简单恢复模式下)设法咀嚼所有可用磁盘空间(刚刚超过200 GB,当数据库占用18GB)并且等待两天后查询将失败,如果我没有弄错的话.我设法保持日志不会增长(现在只有33 MB),但查询已经连续运行了6天,并且它看起来不会很快就会停止.
我在相当不错的计算机上运行它(4GB RAM,Core 2 Duo(E8400)3GHz,Windows Server 2008,SQL Server 2008)并且我注意到计算机偶尔会每30秒(给予或接受)一次几秒钟.这使得它很难用于其他任何事情,这真的让我感到紧张.
现在,这是查询:
SELECT EGM.Name, BioEntity.BioEntityId INTO AUX
FROM EGM INNER JOIN BioEntity
ON EGM.name LIKE BioEntity.Name AND EGM.TypeId = BioEntity.TypeId
Run Code Online (Sandbox Code Playgroud)
我手动设置了一些索引; EGM和BioEntity都有一个包含TypeId和Name的非聚集覆盖索引.但是,查询运行了五天,它也没有结束,所以我尝试运行Database Tuning Advisor来使事情发挥作用.它建议删除我的旧索引并创建统计信息和两个聚簇索引(每个表上一个,只包含我发现相当奇怪的TypeId - 或者只是简单的愚蠢 - 但我还是试了一下).
它现在已经运行了6天,我仍然不确定该怎么做......任何想法的人?我怎样才能更快(或者至少有限)?
更新: - 好的,我已取消查询并重新启动服务器以使操作系统重新启动并运行 - 我正在使用您提议的更改重新运行工作流程,特别是将nvarchar字段裁剪为更小的尺寸并交换"like"为"=".这将需要至少两个小时,所以我稍后会发布进一步的更新
更新2(格林尼治标准时间下午1点,2009年11月18日): - 估计的执行计划显示有关表扫描的成本为67%,然后是33%的哈希匹配.接下来是0%的并行性(这不是很奇怪吗?这是我第一次使用估计的执行计划,但这个特殊的事实只是抬起了我的眉毛),0%哈希匹配,0%并行度,0%顶部,0 %table insert和最后另一个0%select into.似乎索引是垃圾,正如预期的那样,所以我将制作手动索引并丢弃糟糕的建议.
sql sql-server inner-join query-optimization sql-server-2008
我有两张桌子:
和
如何列出表服务并汇集客户表的客户名称?表中的现场客户服务具有客户表中客户的ID,
我很感谢你的帮助
我是sql的新手,所以请善待.
假设我必须显示所有具有相同电话号码的employee_ids(两列都在同一个表中)
我如何继续这个问题内部联接或什么.
我希望能够根据表达式的结果内部连接两个表.
到目前为止我一直在努力:
INNER JOIN CASE WHEN RegT.Type = 1 THEN TimeRegistration ELSE DrivingRegistration AS RReg
ON
RReg.RegistreringsId = R.Id
Run Code Online (Sandbox Code Playgroud)
RegT是我在此加入之前创建的联接:
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
Run Code Online (Sandbox Code Playgroud)
此SQL脚本不起作用.
总而言之,如果Type是1,那么它应该加入表中,TimeRegistration否则它应该加入DrivingRegistration.
解:
在我的select语句中,我执行了以下连接:
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
LEFT OUTER JOIN TimeRegistration AS TReg ON TReg.RegistreringsId = R.Id AND RegT.Type = 1
LEFT OUTER JOIN DrivingRegistration AS DReg ON DReg.RegistreringsId = R.Id AND RegT.Type <>1
Run Code Online (Sandbox Code Playgroud)
然后我编辑我where-clause的输出正确,取决于RegType,像这样: …
我正在使用此脚本,尝试连接2个表,其中包含3个条件并更新T1:
Update T1 set T1.Inci = T2.Inci
ON T1.Brands = T2.Brands
AND T1.Category= T2.Category
AND T1.Date = T2.Date
Run Code Online (Sandbox Code Playgroud)
但我遇到了:
Incorrect syntax near the keyword 'ON'.
无法弄明白为什么.
我遇到了一个mysql查询的奇怪性能问题.
SELECT
`pricemaster_products`.*,
`products`.*
FROM `pricemaster_products`
LEFT JOIN `products`
ON `pricemaster_products`.`ean` = `products`.`products_ean`
Run Code Online (Sandbox Code Playgroud)
我明确地想要使用左连接.但是查询需要花费更多的时间.
我试图将连接更改为INNER JOIN.查询现在非常快,但结果不是我需要的.
我使用了解释并得出以下结论:
如果我使用"LEFT JOIN",那么查询的EXPLAIN会导致......
type: "ALL"
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 90.000 / 50.000 (the full number of the corresponding table)
Run Code Online (Sandbox Code Playgroud)
......对于两张桌子.
如果我使用"INNER JOIN",那么EXPLAIN会给出:
对于表"产品":
Same result as above.
Run Code Online (Sandbox Code Playgroud)
对于表"pricemaster_products":
type: "ref"
possible_keys: "ean"
key: ean
key_len: 767
ref: func
rows: 1
extra: using where
Run Code Online (Sandbox Code Playgroud)
两个表都在相关列上设置了索引.我想到LEFT JOIN如此缓慢的唯一可能原因是根本不使用索引.但为什么不呢?
表结构如下:
CREATE TABLE IF NOT EXISTS `pricemaster_products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`provider` …Run Code Online (Sandbox Code Playgroud) inner-join ×10
sql ×7
mysql ×4
sql-server ×4
join ×2
cross-join ×1
database ×1
distinct ×1
left-join ×1
sql-update ×1
t-sql ×1