基于我放置过滤条件的位置,查询中的过滤条件会得到不同的结果.我的问题是:
鉴于简化的方案:
--Table: Parent Columns: ID, Name, Description
--Table: Child Columns: ID, ParentID, Name, Description
--Query 1
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM Parent p
LEFT OUTER JOIN Child c ON (p.ID = c.ParentID)
WHERE c.ID IS NULL OR c.Description = 'FilterCondition'
--Query 2
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM Parent p
LEFT OUTER JOIN Child c
ON (p.ID = c.ParentID AND c.Description = 'FilterCondition')
Run Code Online (Sandbox Code Playgroud)
我假设查询将返回相同的结果集,当他们没有时,我感到很惊讶.我正在使用MS SQL2005并且在实际查询中,查询1返回~700行,查询2返回~1100行,我无法检测返回行和排除哪些行的模式.查询1中仍有许多行,子行包含数据和NULL数据.我更喜欢查询2的样式(我认为它更优),但我认为查询会返回相同的结果.
编辑/概述:
这里提供了一些很棒的答案.我很难选择给谁答案.我决定选择mdma,因为它是第一个答案,也是最清晰的答案之一.根据提供的答案,这是我的总结:
可能的结果:
我试图更直观地掌握 SQL 连接。就在昨天,我了解了如何将 RIGHT JOIN 重写为 LEFT JOIN(通过翻转表格的顺序),这帮助我更好地理解了这两个连接的工作方式。
但是,现在我想知道是否可以将 INNER JOIN 重写为带有 WHERE 条件的 LEFT JOIN——这意味着它们的逻辑可能是等效的(“逻辑”不是指执行计划,而是将描述预期的结果集)。
喜欢:
SELECT * FROM HeaderTable
INNER JOIN DetailTable
ON HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)
我将其读作“向我显示HeaderTable和DetailTable表中在HeaderTable.ID和DetailTable.ParentID字段中具有匹配值的所有记录。” 与以下相同:
SELECT * FROM HeaderTable
LEFT JOIN DetailTable
ON HeaderTable.ID = DetailTable.ParentID
WHERE HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)
这也是我读作“让我看看表中的所有记录HeaderTable和DetailTable其中的价值HeaderTable.ID相同的值DetailTable.ParentID。”
这些会返回相同的结果集吗?我更多地询问逻辑是否相同,而不是一个比另一个更有效。
如果我可能会问,请不要用任何维恩图来回答,因为这些似乎并没有准确地描述连接的逻辑。
我有两个通过OneToMany双向关系相关的类。对于每个订阅,都会在订阅表中添加一个新行。我想获得按最大订阅数排序的培训列表。这是我的实体:
class Trainings
{
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Subscriptions", mappedBy="id_training")
*/
private $subscriptions_lists;
// ...
}
Run Code Online (Sandbox Code Playgroud)
class Subscriptions
{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Trainings" , inversedBy="subscriptions_lists")
* @ORM\JoinColumn(name="id_training", referencedColumnName="id",onDelete="CASCADE")
*/
private $id_training;
Run Code Online (Sandbox Code Playgroud)
$trainings = $em->getRepository('AppBundle:Trainings')
->createQueryBuilder('t')
->innerJoin('t.subscriptions_lists', 'subscription')
->orderBy('COUNT(subscription.id)', 'DESC')
->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)
我收到此异常:
[语法错误] 第 0 行,第 87 列:错误:预期已知函数,得到“计数”
SQL左连接查询忽略左表ON column = constant上的谓词。
但是,它关心右表上的另一个谓词。ON column = constant
如果我将左表移动ON column = constant到 WHERE 子句,则查询将按预期工作。
对于左表,如果我将 放在column = constant查询的 WHERE 部分或查询的 JOIN ... ON 部分,这有什么关系?
(发生的情况是,左表ON column = constant条件被推到了“JOIN Filter”步骤,在那里它似乎被忽略了。)
细节:
EXPLAIN ANALYZE
select * from DW1_PAGE_PATHS t left join DW1_PAGES g
on t.TENANT = g.TENANT
and t.PAGE_ID = g.GUID
and g.GUID = 'abcdefg' -- works
and t.CANONICAL = 'C' -- "ignored", unless moved to `where` …Run Code Online (Sandbox Code Playgroud) 我读了一篇关于JOINS的好文章,"INNER JOIN"和"OUTER JOIN"有什么区别?但我不认为这有助于我的问题.
我想将两个select语句组合成一个select语句AND,使其对任何要查询的数据库都有效.
这就是我所拥有的
SELECT
(SELECT COUNT(*)
FROM dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.IDENTITY_MAP, dbo.SEM_CLIENT,dbo.SEM_AGENT,dbo.PATTERN
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
AND dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
AND Name like '%Staten Island%'
AND dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%') AS 'Windows-SEP-11',
(SELECT COUNT(*)
FROM dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.IDENTITY_MAP, dbo.SEM_CLIENT,dbo.SEM_AGENT,dbo.PATTERN
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
AND dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
AND Name like …Run Code Online (Sandbox Code Playgroud) 我的一位同事的文件夹/目录中有很多sql陈述。该文件夹也由他每天更新。我想sql为期货同事记录这些声明。但是,我正在寻找一种使该过程“自动化”的方法。我想crontab每周使用一次并运行一个R-Markdown文件,该文件会自动更新现有R-Markdown文件。
我的方法如下:
path = "c:/SQL_files/"
out.file<-""
file.names <- dir(path, pattern =".sql") # here I changed `.txt` to `.sql`
for(i in 1:length(file.names)){
file <- read.csv2.sql(file.names[i],header=TRUE, sep=";", stringsAsFactors=FALSE)
out.file <- rbind(out.file, file)
}
# That second approach comes very close, but just generates a `.txt` for the first
#`.sql` file in the directory with the error:
Error in match.names(clabs, names(xi)) :
names do not match previous names
Run Code Online (Sandbox Code Playgroud)
文件在哪里:
[1] "c:/SQL_files/first.sql"
[2] "c:/SQL_files/second.sql" …Run Code Online (Sandbox Code Playgroud) SELECT *
FROM notifications
INNER JOIN COMMENT
ON COMMENT.id = notifications.source_id
WHERE idblog IN (SELECT blogs_id
FROM blogs
WHERE STATUS = "active")
INNER JOIN reportmsg
ON reportmsg.msgid = notifications.source_id
WHERE uid =: uid
ORDER BY notificationid DESC
LIMIT 20;
Run Code Online (Sandbox Code Playgroud)
在这里,我INNER JOIN荷兰国际集团notifications与comment和reportmsg; 然后过滤内容WHERE.
但我的问题是,第一INNER JOIN[即与comment],在加入之前notifications有comment,我想匹配notifications.idblog与blogs.blogs_id 和 SELECT只有那些行,其中blogs.status = "active".
为了更好地理解上面的代码:
这里,INNER JOIN与comment我想SELECT …
我有多个连接,包括mysql中的左连接.有两种方法可以做到这一点.
我可以在每次加入后立即设置"ON"条件:
select*from A join B ON(A.bid = B.ID)join C ON(B.cid = C.ID)join D ON(c.did = D.ID)
我可以将它们全部放在一个"ON"子句中:
select*from A join B join C join D ON(A.bid = B.ID AND B.cid = C.ID AND c.did = D.ID)
哪种方式更好?
如果我在查询中需要左连接或右连接,它是否不同?
我访问过许多网站,找到关于哪个更好的答案,即ANSI或非ANSI语法。这两个查询有什么区别?
select a.name,a.empno,b.loc
from tab a, tab b
where a.deptno=b.deptno(+);
Run Code Online (Sandbox Code Playgroud)
和:
select a.name,a.empno,b.loc
from tab a
left outer join tab b on a.deptno=b.deptno;
Run Code Online (Sandbox Code Playgroud)
在两种情况下结果都是相同的。第二个查询也更长。哪一个更好?
假设是否基于需要连接它们的条件在上面的查询中添加了另一个表Salgrade?..谁能假设一张桌子并给我解释
我有以下问题。我有 2 个表想要加入“TableALong”和“TableBLong”
TableALong
ID, Name, Store,Age
1, John, Walmart, 5
2, Johnny, Walmart, 8
3, Johnny, Target , 10
4, Bill, Shoppers, 2
5, Joe, Target, 3
TableBLong
ID, Name, Store, StoreAddress
1, John, Walmart, 35353 Address
1, John, Walmart, 53544 Address
2, Johnny, Walmart, 35353 Address
Run Code Online (Sandbox Code Playgroud)
在加入之前,我想做一些类似 ALIAS 的事情,我有这样的事情:
SELECT A.ID, A.NAME, A.STORE, A.AGE, B.STOREADDRESS
FROM TableALong as A, TableBLong as B
ON A.NAME = B.NAME and A.STORE = B.STORE
Run Code Online (Sandbox Code Playgroud)
这在oracle中是无效的。让它在 oracle 中运行的正确查询是什么?我认为这是我想要的左连接?(连接后,TableALong 中的每一项都会有多行。)
sql ×6
join ×3
left-join ×3
inner-join ×2
mysql ×2
oracle ×2
sql-server ×2
doctrine ×1
doctrine-orm ×1
knitr ×1
on-clause ×1
postgresql ×1
r ×1
r-markdown ×1
symfony ×1