在尝试提高极慢查询的速度时(在两个表上只有几万分钟,在SQL Server 2008上只有几万行,如果重要的话),我将问题缩小到OR我的内连接中,如:
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID
OR ot.ID = mt.ParentID
Run Code Online (Sandbox Code Playgroud)
我把它更改为(我希望是)一对等效的左连接,如下所示:
SELECT mt.ID, mt.ParentID,
CASE WHEN ot1.MasterID IS NOT NULL THEN
ot1.MasterID ELSE
ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
..现在查询运行大约一秒钟!
OR加入条件通常是个坏主意吗?或者我在桌子的布局中不知何故不幸?
我有一个users表和一个payments表,对于每个用户,其中有付款,可能在payments表中有多个相关的付款.我想选择所有付款用户,但只选择最新付款.我正在尝试这个SQL,但我从来没有尝试过嵌套的SQL语句,所以我想知道我做错了什么.感谢帮助
SELECT u.*
FROM users AS u
INNER JOIN (
SELECT p.*
FROM payments AS p
ORDER BY date DESC
LIMIT 1
)
ON p.user_id = u.id
WHERE u.package = 1
Run Code Online (Sandbox Code Playgroud) 我有这个代码
User.find(:all, :limit => 10, :joins => :user_points,
:select => "users.*, count(user_points.id)", :group =>
"user_points.user_id")
Run Code Online (Sandbox Code Playgroud)
它生成以下sql
SELECT users.*, count(user_points.id)
FROM `users`
INNER JOIN `user_points`
ON user_points.user_id = users.id
GROUP BY user_points.user_id
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
是否可以以其他方式进行LEFT JOIN而不是INNER JOIN,User.find_by_sql并且可以手动输入查询?
我有这个跨数据库查询...
SELECT
`DM_Server`.`Jobs`.*,
`DM_Server`.servers.Description AS server,
digital_inventory.params,
products.products_id,
products.products_pdfupload,
customers.customers_firstname,
customers.customers_lastname
FROM `DM_Server`.`Jobs`
INNER JOIN `DM_Server`.servers ON servers.ServerID = Jobs.Jobs_ServerID
JOIN `cpod_live`.`digital_inventory` ON digital_inventory.jobname = Jobs.Jobs_Name
JOIN `cpod_live`.`products` ON products.products_pdfupload = CONCAT(digital_inventory.jobname, ".pdf")
JOIN `cpod_live`.`customers` ON customers.customers_id = products.cID
ORDER BY `DM_Server`.`Jobs`.Jobs_StartTime DESC LIMIT 50
Run Code Online (Sandbox Code Playgroud)
它运行良好,直到我做它们LEFT JOIN.我认为通过不指定一种类型的连接,它被认为是一种LEFT JOIN.这不是这种情况吗?
我已经掌握了LINQ-to-SQL的基础知识,但我一直在努力让JOIN正常工作.我想知道如何将以下内容转换为LINQ-to-SQL(理想情况下使用方法链接,因为这是我的首选格式).
SELECT c.CompanyId, c.CompanyName,
p.FirstName + ' ' + p.LastName as AccountCoordinator,
p2.FirstName + ' ' + p2.LastName as AccountManager
FROM dbo.Companies c
INNER JOIN dbo.Persons p
ON c.AccountCoordinatorPersonId = p.PersonId
INNER JOIN dbo.Persons p2
ON c.AccountManagerPersonId = p2.PersonId
Run Code Online (Sandbox Code Playgroud) 我目前可以通过以下方式查询外键/主键相等的两个表的连接.
$result = mysql_query("SELECT * FROM `table1`
INNER JOIN
`table2` ON table1.primaryKey=table2.table1Id");
Run Code Online (Sandbox Code Playgroud)
我想将它扩展到多个表(都使用相同的外键).我正在尝试以下代码,它没有返回任何内容.谁能指出我做错了什么?
$result = mysql_query("SELECT * FROM `table1`
INNER JOIN `table2`
INNER JOIN table3
ON table1.primaryKey=table2.table1Id=table3.table1Id");
Run Code Online (Sandbox Code Playgroud) 同一查询的这两个版本在性能方面有什么不同吗?
--Version 1
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN SalesOrderDetail s on p.ProductID = s.ProductID
--Version 2
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s on p.ProductID = s.ProductID
Run Code Online (Sandbox Code Playgroud)
我听说(由DBA)说版本2更快,因为它在内部SELECT语句中仅获取查询所需的列.但这似乎没有意义,因为查询性能(据我所知)是基于受影响的行数和返回的最终列列表.
两者的查询计划是相同的,所以我猜这两者之间没有任何区别.
我对么?
我正在尝试将DataFrame A内部连接到DataFrame B并遇到错误.
这是我的连接声明:
merged = DataFrameA.join(DataFrameB, on=['Code','Date'])
Run Code Online (Sandbox Code Playgroud)
这是错误:
ValueError: len(left_on) must equal the number of levels in the index of "right"
Run Code Online (Sandbox Code Playgroud)
我不确定列顺序是否重要(它们不是真正"有序"的吗?),但为了以防万一,DataFrames组织如下:
DataFrameA: Code, Date, ColA, ColB, ColC, ..., ColG, ColH (shape: 80514, 8 - no index)
DataFrameB: Date, Code, Col1, Col2, Col3, ..., Col15, Col16 (shape: 859, 16 - no index)
Run Code Online (Sandbox Code Playgroud)
我需要更正我的加入声明吗?或者是否有另一种更好的方法来获得这两个DataFrame的交集(或内连接)?
需要一些SQL语法帮助:-)
两个数据库都在同一台服务器上
db1 = DHE
db2 = DHE_Import
UPDATE DHE.dbo.tblAccounts
INNER JOIN DHE_Import.dbo.tblSalesRepsAccountsLink
ON DHE.dbo.tblAccounts.AccountCode = DHE_Import.tblSalesRepsAccountsLink.AccountCode
SET DHE.dbo.tblAccounts.ControllingSalesRep = DHE_Import.dbo.tblSalesRepsAccountsLink.SalesRepCode
Run Code Online (Sandbox Code Playgroud)
我可以在Access中使用具有类似语法的链接表进行查询 - 但是SQL不喜欢它.
我确定这是一个简单的问题:-D
谢谢!
假设我有一个mySQL表(用户),其中包含以下字段:
userid
gender
region
age
ethnicity
income
Run Code Online (Sandbox Code Playgroud)
我希望能够根据用户输入的数量返回总记录数.此外,他们还将提供额外的标准.
在最简单的例子中,他们可能会要求1000条记录,其中600条记录应该是性别="男性",400条记录中性别="女性".这很简单.
现在,再往前走一步.假设他们现在想要指定Region:
GENDER
Male: 600 records
Female: 400 records
REGION
North: 100 records
South: 200 records
East: 300 records
West: 400 records
Run Code Online (Sandbox Code Playgroud)
同样,只应返回1000条记录,但最终必须有600名男性,400名女性,100名北方人,200名南方人,300名东方人和400名西方人.
我知道这不是有效的语法,但使用伪mySQL代码,它有希望说明我正在尝试做什么:
(SELECT * FROM users WHERE gender = 'Male' LIMIT 600
UNION
SELECT * FROM users WHERE gender = 'Female' LIMIT 400)
INTERSECT
(SELECT * FROM users WHERE region = 'North' LIMIT 100
UNION
SELECT * FROM users WHERE region = 'South' LIMIT 200
UNION
SELECT * FROM users …Run Code Online (Sandbox Code Playgroud) inner-join ×10
sql ×5
join ×3
mysql ×3
sql-server ×3
database ×2
left-join ×2
select ×2
activerecord ×1
c# ×1
linq ×1
linq-to-sql ×1
merge ×1
pandas ×1
python ×1
syntax ×1
t-sql ×1