相关疑难解决方法(0)

关于左外连接和Where条件的SQL标准

基于我放置过滤条件的位置,查询中的过滤条件会得到不同的结果.我的问题是:

  • 这些查询之间是否存在技术差异?
  • SQL标准中是否有任何内容可以解释查询中的不同记录集?

鉴于简化的方案:

--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,因为它是第一个答案,也是最清晰的答案之一.根据提供的答案,这是我的总结:

可能的结果:

  • 答:父母没有孩子
  • B:有孩子的父母
  • | - …

sql left-join

7
推荐指数
2
解决办法
3107
查看次数

SQL INNER JOIN vs LEFT JOIN with a WHERE

我试图更直观地掌握 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)

我将其读作“向我显示HeaderTableDetailTable表中在HeaderTable.IDDetailTable.ParentID字段中具有匹配值的所有记录。” 与以下相同:

SELECT * FROM HeaderTable
LEFT JOIN DetailTable 
ON    HeaderTable.ID = DetailTable.ParentID
WHERE HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)

这也是我读作“让我看看表中的所有记录HeaderTableDetailTable其中的价值HeaderTable.ID相同的值DetailTable.ParentID。”

这些会返回相同的结果集吗?我更多地询问逻辑是否相同,而不是一个比另一个更有效。

如果我可能会问,请不要用任何维恩图来回答,因为这些似乎并没有准确地描述连接的逻辑。

sql-server join inner-join left-join

6
推荐指数
1
解决办法
3527
查看次数

Doctrine 中的按计数排序

我有两个通过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 列:错误:预期已知函数,得到“计数”

doctrine symfony doctrine-orm

5
推荐指数
1
解决办法
1429
查看次数

SQL / PostgreSQL 左连接忽略左表上的“on = constant”谓词

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)

sql postgresql left-join

4
推荐指数
1
解决办法
1894
查看次数

简化MS SQL语句

我读了一篇关于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-server

4
推荐指数
1
解决办法
423
查看次数

如何使用R提取SQL文件的内容?

我的一位同事的文件夹/目录中有很多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)

r knitr r-markdown

4
推荐指数
1
解决办法
678
查看次数

什么是正确的SELECT语句?

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荷兰国际集团notificationscommentreportmsg; 然后过滤内容WHERE.

但我的问题是,第一INNER JOIN[即与comment],在加入之前notificationscomment,我想匹配notifications.idblogblogs.blogs_id SELECT只有那些行,其中blogs.status = "active".

为了更好地理解上面的代码:

ER图

这里,INNER JOINcomment我想SELECT …

mysql sql inner-join

4
推荐指数
1
解决办法
359
查看次数

在多个连接中放置'on'条件哪里更好?(MySQL的)

我有多个连接,包括mysql中的左连接.有两种方法可以做到这一点.

  1. 我可以在每次加入后立即设置"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)

  2. 我可以将它们全部放在一个"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)

哪种方式更好?

如果我在查询中需要左连接右连接,它是否不同?

mysql join on-clause

3
推荐指数
1
解决办法
960
查看次数

ANSI和非ANSI联接之间有什么区别,您推荐哪些?

我访问过许多网站,找到关于哪个更好的答案,即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?..谁能假设一张桌子并给我解释

sql oracle join

3
推荐指数
1
解决办法
2万
查看次数

如何在oracle中对两个表执行别名连接?

我有以下问题。我有 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 oracle

3
推荐指数
1
解决办法
7803
查看次数