在 Django 的 FROM 中发出子查询

发布于 2025-01-17 01:56:03 字数 826 浏览 0 评论 0原文

我正在尝试像这样生成 SQL:

SELECT ...
FROM bigtable
INNER JOIN (
   SELECT DISTINCT key
   FROM smalltable
   WHERE smalltable.x = 'user_input'
) subq ON bigtable.key = subq.key

我已经用 Django 尝试了一些东西,到目前为止我已经得到了:

subq = Smalltable.objects.filter(x='%s').values("key").distinct("key")
queryset = Bigtable.objects.extra(
    tables=[f"({subq.query}) subq"],
    where=["bigtable.key = smalltable.key"],
    params=["user_input"],
)

这里的目标是 bigtable 和 DISTINCT Smalltable 上的交叉连接。 ON 子句随后被 WHERE 中的条件替换。换句话说,一个有效的老式内部连接。

姜戈几乎拥有了它。它生成的 SQL 如下所示:

SELECT ...
FROM bigtable, "(SELECT DISTINCT ...) subq"
WHERE (bigtable.key = subq.key)

注意双引号 - Django 只期望那里有一个表文字,并按如下方式对其进行转义。我怎样才能以这种方式或其他方式完成这个查询?对我来说重要的是,它是用于查询规划目的的实际联接而不是 IN 或 EXISTS。

I am trying to produce SQL like so:

SELECT ...
FROM bigtable
INNER JOIN (
   SELECT DISTINCT key
   FROM smalltable
   WHERE smalltable.x = 'user_input'
) subq ON bigtable.key = subq.key

I have tried a handful of stuff with Django, and so far I've got:

subq = Smalltable.objects.filter(x='%s').values("key").distinct("key")
queryset = Bigtable.objects.extra(
    tables=[f"({subq.query}) subq"],
    where=["bigtable.key = smalltable.key"],
    params=["user_input"],
)

The goal here is a cross join on bigtable and the DISTINCT smalltable. The ON clause is then replaced by a condition in the WHERE. In other words, a valid old-school inner join.

And Django ALMOST has it. It is producing SQL like so:

SELECT ...
FROM bigtable, "(SELECT DISTINCT ...) subq"
WHERE (bigtable.key = subq.key)

Note the double quotes - Django expects a table literal only there and is escaping it as so. How can I get this query done, in either this way or another way? It is important for me that it's an actual join vs IN or EXISTS for query planning purposes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文