有没有办法在联接WITH
子句中访问联接实体的关系?我试图避免IN
在子查询中使用子句。
编辑: 还是有一种方法可以联接子查询而不是使用IN
?
即确保连接对象的t.final
值为1。
尝试避免此查询
SELECT o
FROM Entity\Order o
WHERE o.status = :orderStatus
AND o.id NOT IN (
SELECT o2.id
FROM Entity\ServiceRequest s
JOIN s.order o2
JOIN s.serviceType t
WHERE s.status = :serviceStatus
AND t.final = 1
)
重写尝试失败: 无法访问s.serviceType.final
SELECT o
FROM Entity\Order o
LEFT JOIN o.serviceRequests s
WITH s.status = :serviceStatus
AND s.serviceType.final = 1
LEFT JOIN s.serviceType t
WHERE o.status = :orderStatus
AND COUNT(s) = 0
订单实体:
<?php
namespace Entity;
/**
* @Entity(repositoryClass="Repository\Order")
* @Table(name="orders")
*/
class Order
{
const STATUS_REVIEW = 0;
const STATUS_PENDING = 1;
const STATUS_SCHEDULED = 2;
const STATUS_COMPLETE = 3;
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*
* @var int
*/
protected $id;
/**
* @ManyToOne(targetEntity="Invoice")
*
* @var Invoice
*/
protected $invoice;
/**
* @Column(type="integer")
*
* @var int
*/
protected $status;
/**
* @Column(type="smallint", name="is_canceled")
*
* @var int
*/
protected $isCanceled;
/**
* @OneToMany(targetEntity="ServiceRequest", mappedBy="order")
*
* @var ServiceRequest[]
*/
protected $serviceRequests;
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return \Entity\Invoice
*/
public function getInvoice()
{
return $this->invoice;
}
/**
* @return int
*
* @uses \Entity\Order::STATUS_REVIEW
* @uses \Entity\Order::STATUS_PENDING
* @uses \Entity\Order::STATUS_SCHEDULED
* @uses \Entity\Order::STATUS_COMPLETE
*/
public function getStatus()
{
return $this->status;
}
/**
* @param int $status
*
* @uses \Entity\Order::STATUS_REVIEW
* @uses \Entity\Order::STATUS_PENDING
* @uses \Entity\Order::STATUS_SCHEDULED
* @uses \Entity\Order::STATUS_COMPLETE
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* @return int
*/
public function getIsCanceled()
{
return $this->isCanceled;
}
public function cancel()
{
$this->isCanceled = 1;
}
/**
* @return ServiceRequest[]
*/
public function getServices()
{
return $this->services;
}
}
ServiceRequest实体:
/**
* @Entity
* @Table(name="order_service_requests")
*/
class ServiceRequest
{
const STATUS_REVIEW = 0;
const STATUS_PENDING = 1;
const STATUS_SCHEDULED = 2;
const STATUS_COMPLETE = 3;
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*
* @var int
*/
protected $id;
/**
* @ManyToOne(targetEntity="Invoice")
*
* @var Invoice
*/
protected $invoice;
/**
* @ManyToOne(targetEntity="ServiceType")
* @JoinColumn(name="service_types_id")
*
* @var ServiceType
*/
protected $serviceType;
/**
* @ManyToOne(targetEntity="Order")
* @JoinColumn(name="orders_id")
*
* @var Order
*/
protected $order;
/**
* @Column(type="integer")
*
* @var int
*/
protected $status;
/**
* @Column(type="smallint", name="is_canceled")
*
* @var int
*/
protected $isCanceled;
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return \Entity\Invoice
*/
public function getInvoice()
{
return $this->invoice;
}
/**
* @return int
*
* @uses \Entity\ServiceRequest::STATUS_REVIEW
* @uses \Entity\ServiceRequest::STATUS_PENDING
* @uses \Entity\ServiceRequest::STATUS_SCHEDULED
* @uses \Entity\ServiceRequest::STATUS_COMPLETE
*/
public function getStatus()
{
return $this->status;
}
/**
* @param int $status
*
* @uses \Entity\ServiceRequest::STATUS_REVIEW
* @uses \Entity\ServiceRequest::STATUS_PENDING
* @uses \Entity\ServiceRequest::STATUS_SCHEDULED
* @uses \Entity\ServiceRequest::STATUS_COMPLETE
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* @return \Entity\ServiceType
*/
public function getServiceType()
{
return $this->serviceType;
}
/**
* @return int
*/
public function isCanceled()
{
return $this->isCanceled;
}
public function getOrder()
{
return $this->order;
}
}
ServiceType实体:
<?php
namespace Entity;
/**
* @Entity
* @Table(name="service_types")
*/
class ServiceType
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*
* @var int
*/
protected $id;
/**
* @Column(type="smallint")
*
* @var int
*/
protected $final;
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return int
*/
public function getFinal()
{
return $this->final;
}
}
您要在加入服务类型之前对其进行查询。尝试:
SELECT o
FROM Entity\Order o
LEFT JOIN o.serviceRequests s
WITH s.status = :serviceStatus
LEFT JOIN s.serviceType t
WHERE o.status = :orderStatus
AND COUNT(s) = 0
AND t.final = 1
问题内容: 我在尝试执行查询时遇到了一些问题。我有两个表,一个表包含元素信息,另一个表包含与第一个表的元素相关的记录。想法是在同一行中获取元素信息以及多个记录信息。 结构可以这样解释: 这是我想要实现的: 以下查询可获得正确的结果,但对我而言似乎效率极低,必须为每个列迭代table2。无论如何,可以进行子查询并重用它吗? 问题答案: 您可以将聚合取出到CTE(公用表表达式)中: 当然,这实际上是什
问题内容: 我正在重构Zend Framework 2 应用程序,以使用准则2.5 DBAL代替Zend_DB(ZF1)。我有以下Zend_Db查询: 这将导致以下MySQL查询: 我无法弄清楚如何使用教义2.5查询生成器加入子查询。在主查询中,我需要从子查询中选择列。 我在这里已经读到,该学说不支持加入子查询。如果仍然如此,是否可以使用主义DBAL的SQL查询构建器以其他方式编写此查询?原生SQ
问题内容: 在Django中,如果我有模型类,例如 然后,如果我想向模型添加方法以存储例如相当复杂的过滤器,则可以添加自定义模型管理器,例如 然后我可以做: 有什么方法可以添加可链接到模型的查询集末尾的自定义方法? 即以一种我可以做到的方式添加自定义方法: 问题答案: 您需要向最终添加的方法添加方法。因此,您需要创建和使用一个子类,该子类具有在需要此功能的位置定义的方法。 我找到了本教程,该教程说
问题内容: 给定一个表名和一个列名,我试图动态删除一个我事先不知道名称的Oracle约束。 我可以通过以下查询找到约束名称: 我的第一个想法是使用子查询,但这不起作用,并导致ORA-02250错误: 到目前为止,我唯一可行的解决方案是以下解决方案,但感觉不必要的复杂: 是否有一种方法可以像我最初打算的那样使用子查询来做到这一点?如果不是,那么有人可以建议一种更简洁的方法吗? 问题答案: 你不能
问题内容: 我有这样的SQL语句: 因此,它为personID提供了“区别”行: 如果我有这样的表: 它会回来 现在,我尝试通过JPA CriteriaBuilder进行此操作。 我的第一个想法是子查询: 但这会产生错误 怎么对这个? 马可 问题答案: 我认为解决方案比看起来简单。您忘记了包含在CriteriaBuilder子查询中。以下代码执行您要查找的查询。 此代码将创建以下查询: 我认为您正
问题内容: 当需要有序集的最后一行时,通常会创建派生表并重新排序。例如,要以自动递增的方式返回表的最后3个元素: 由于也可以具有偏移量,因此如果我们事先知道此查询的行数(例如10),则可以实现相同的结果: 是否可以对表运行子查询并使用该数字动态构建一个? 问题答案: 不,不可能指定动态偏移量。 带有子查询的原始查询是执行此操作的最简单方法。