将多个联接合并到一个SQL语句中



我的数据库模式中有三个表:my_TABLE、CREATIVE_SIZE、REVERSE_CREATE _VIZE

MY_TABLE由三列组成

|            NAME             |   BANNER_W  |  BANNER_H |
|     320x480_Toyota          |     320     |   480     |
| Tim_Horton_IO00122_1024x320 |     1024    |   320     |
|     Walmart_IO00134         |     80      |    80     |
|     Mcdonalds_320x1024      |     320     |   1024    |
....

CREATIVE_SIZE_TABLE由一列组成

| CREATIVE_SIZE |
|   320x480     |
|   1024x320    |
....

REVERSE_CREATIVE_SIZE_TABLE由两列组成

| CREATIVE_SIZE | REVERSED_SIZE |
|   320x480     | 480x320       |     
|   1024x320    | 320x1024      |
....

我有几个条件想要实现:

  1. NAME上的完整外部JOIN MY_TABLE和CREATIVE_SIZE_TABLE包含CREATIVE_SIZE

  2. 由于它是一个完整的外部联接,一些CREATIE_SIZE是NULL,对于这些NULL值,我想做两件事:

    a。检查他们的NAME是否包含REVERSED_SIZE,如果包含,则用CREATIVE_SIZE 填充NULL

    b。用BANNER_W和BANNER_H(aaaxbbb格式)填充NULL的其余部分

到目前为止,我只有这个,我不知道如何在我的sql语句中添加a.b.

SELECT CREATIVE_NAME, AD_BANNER_W, AD_BANNER_H, CREATIVE_SIZE
FROM CREATIVE_SIZE_TABLE cst
LEFT JOIN CREATIVE_SIZE cs
ON cst.CREATIVE_NAME ILIKE '%' || cs.CREATIVE_SIZE || '%'

感谢您的帮助。谢谢

只需使用左联接,然后合并即可找到非空联接。

SELECT COALESCE(cs.CREATIVE_SIZE, revs.REVERSED_SIZE, AD_BANNER_W||'x'||AD_BANNER_H) as MYSIZE,
CREATIVE_NAME, AD_BANNER_W, AD_BANNER_H, CREATIVE_SIZE
FROM CREATIVE_SIZE_TABLE cst
LEFT JOIN CREATIVE_SIZE cs
ON cst.CREATIVE_NAME ILIKE '%' || cs.CREATIVE_SIZE || '%'
LEFT JOIN REVERSE_CREATIVE_SIZE_TABLE revs
ON cst.CREATIVE_NAME ILIKE '%' || revs.REVERSED_SIZE || '%'

注意:虽然这会起作用,但LIKE总是很慢——如果你经常这样做,你可能想对数据进行一些预处理,以加快查询速度——如果这是一次性的,那也没关系。

与Hogan发布的代码相同,但使用CONTAINS来避免在WHERE子句中进行字符串操作

WITH my_table AS (            
SELECT * FROM VALUES 
('320x480_Toyota', 320, 480)
,('Tim_Horton_IO00122_1024x320', 1024, 320)
,('Walmart_IO00134', 80,  80)
,('Mcdonalds_320x1024', 320, 1024)
v(name, banner_w, banner_h)
), creative_size_table AS (
SELECT * FROM VALUES
('320x480' ),
('1024x320')
v(creative_size )
), reverse_creative_size_table AS (
SELECT * FROM VALUES 
('320x480', '480x320' ),
('1024x320', '320x1024' )
v(creative_size, reversed_size)
)
SELECT mt.name
,COALESCE(cst.creative_size, rcst.creative_size, mt.banner_w || 'x' || mt.banner_h) as NEW_CREATIVE_SIZE
,cst.creative_size AS cst_creative_size
,rcst.creative_size AS rcst_creative_size
,rcst.reversed_size AS rcst_reversed_size
FROM my_table mt
LEFT JOIN creative_size_table cst ON CONTAINS(mt.name, cst.creative_size)
LEFT JOIN reverse_creative_size_table rcst ON CONTAINS(mt.name, rcst.reversed_size)
ORDER BY 1;

给出:

NAME                         NEW_CREATIVE_SIZE        CST_CREATIVE_SIZE         RCST_CREATIVE_SIZE         RCST_REVERSED_SIZE
320x480_Toyota               320x480                  320x480                   NULL                       NULL
Mcdonalds_320x1024           1024x320                 NULL                      1024x320                   320x1024
Tim_Horton_IO00122_1024x320  1024x320                 1024x320                  NULL                       NULL
Walmart_IO00134              80x80                    NULL                      NULL                       NULL

最新更新