简单的Oracle Pivot行到列

发布于 2025-02-06 21:03:32 字数 818 浏览 1 评论 0 原文

我们有一个存储名称/值对的表,一个记录存储主机名,另一个用于存储端口号的记录。

我想用两个列返回一行,而不是返回两行。我可以按以下方式完成它,但是我有几列可以返回,我怀疑枢轴最终可能会产生更简单的SQL。

SELECT
    (
        SELECT
            CCD.DISPL_CTGRY_CD AS EMAIL_HOST
            FROM FDS_MAINT.CONFGRTN_CTGRY_DTL CCD
            WHERE CCD.CONFGRTN_CTGRY_ID = 56
                AND CCD.CONFGRTN_CTGRY_CD = 'HOST'
    ) HOST,
    (
        SELECT
            CCD.DISPL_CTGRY_CD AS EMAIL_HOST
            FROM FDS_MAINT.CONFGRTN_CTGRY_DTL CCD
            WHERE CCD.CONFGRTN_CTGRY_ID = 56
                AND CCD.CONFGRTN_CTGRY_CD = 'PORT'
    ) PORT
    FROM DUAL

如何使用枢轴函数编写此SQL以获取以下结果?

主机 端口
testapp.silver.com 25

我正在使用Oracle 19。

We have a table that stores Name/value pairs, one record to store a Host name and another to store a port number.

Instead of returning two rows, I'd like to return one row with two columns. I could accomplish it as follows but I have several columns to return and I suspect that a PIVOT may yield simpler SQL in the end.

SELECT
    (
        SELECT
            CCD.DISPL_CTGRY_CD AS EMAIL_HOST
            FROM FDS_MAINT.CONFGRTN_CTGRY_DTL CCD
            WHERE CCD.CONFGRTN_CTGRY_ID = 56
                AND CCD.CONFGRTN_CTGRY_CD = 'HOST'
    ) HOST,
    (
        SELECT
            CCD.DISPL_CTGRY_CD AS EMAIL_HOST
            FROM FDS_MAINT.CONFGRTN_CTGRY_DTL CCD
            WHERE CCD.CONFGRTN_CTGRY_ID = 56
                AND CCD.CONFGRTN_CTGRY_CD = 'PORT'
    ) PORT
    FROM DUAL

How can I write this SQL to get the following results using a PIVOT function?

HOST PORT
testapp.silver.com 25

I'm using Oracle 19.

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心凉 2025-02-13 21:03:32

这是两种方法,鉴于我们不是选择具有不同值不同的其他列 -

首先(带有枢轴)

select CONFGRTN_CTGRY_ID,max("'HOST'") as host,
max("'PORT'") as port
from CONFGRTN_CTGRY_DTL
pivot (max (DISPL_CTGRY_CD) for CONFGRTN_CTGRY_CD in ('HOST','PORT') )
group by CONFGRTN_CTGRY_ID

ampddle

select CONFGRTN_CTGRY_ID, max(HOST) as host, max(PORT) as port 
from
(select CONFGRTN_CTGRY_ID,case when CCD.CONFGRTN_CTGRY_CD = 'HOST' 
then CCD.DISPL_CTGRY_CD end AS HOST,
case when CCD.CONFGRTN_CTGRY_CD = 'PORT' 
then CCD.DISPL_CTGRY_CD end AS PORT 
from CONFGRTN_CTGRY_DTL CCD 
WHERE CCD.CONFGRTN_CTGRY_ID in (56,57) )
group by CONFGRTN_CTGRY_ID

-DB Fiddle 在这里

These are two approaches, given we are not selecting other columns with different values -

First (with pivot) -

select CONFGRTN_CTGRY_ID,max("'HOST'") as host,
max("'PORT'") as port
from CONFGRTN_CTGRY_DTL
pivot (max (DISPL_CTGRY_CD) for CONFGRTN_CTGRY_CD in ('HOST','PORT') )
group by CONFGRTN_CTGRY_ID

Second -

select CONFGRTN_CTGRY_ID, max(HOST) as host, max(PORT) as port 
from
(select CONFGRTN_CTGRY_ID,case when CCD.CONFGRTN_CTGRY_CD = 'HOST' 
then CCD.DISPL_CTGRY_CD end AS HOST,
case when CCD.CONFGRTN_CTGRY_CD = 'PORT' 
then CCD.DISPL_CTGRY_CD end AS PORT 
from CONFGRTN_CTGRY_DTL CCD 
WHERE CCD.CONFGRTN_CTGRY_ID in (56,57) )
group by CONFGRTN_CTGRY_ID

DB fiddle here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文