我们正在开发ETL工作,我们的顾问在连接表时一直使用"旧式"SQL
select a.attr1, b.attr1
from table1 a, table2 b
where a.attr2 = b.attr2
Run Code Online (Sandbox Code Playgroud)
而不是使用内部连接子句
select a.attr1, b.attr1
from table1 as a inner join table2 as b
on a.attr2 = b.attr2
Run Code Online (Sandbox Code Playgroud)
我的问题是,从长远来看,是否有使用旧"加入"的风险?这种连接支持多长时间并保持为ANSI标准?我们的平台是SQL Server,我的主要原因是将来不再支持这些"where join".发生这种情况时,我们必须使用"内连接"连接方式修改所有ETL作业.
我的老板要求我只编写ANSI SQL以使其与数据库无关.但我了解到并不是那么容易,因为没有数据库完全兼容ANSI SQL.SQL代码很少在没有修改的情况下在数据库系统之间移植.
我看到人们以不同的方式使他们的程序数据库独立.例如:
你总是把你的代码写成"任何数据库就绪"吗?或者只在需要时才这样做?如果是的话,你是如何实现的?
是否有一个很好的工具可以确保SQL查询是有效的ANSI SQL,以及可选的DBMS将无法解释它?我找到了http://developer.mimer.com/validator但我想知道是否有命令行工具,最好是开源.
是否有与SQL的DECODE函数等效的ANSI SQL?
Oracle的解码函数是SQL中的IF-THEN-ELSE结构.
我想确认一下SQL查询
SELECT ....
FROM apples,
oranges
LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
bananas
WHERE ....
Run Code Online (Sandbox Code Playgroud)
完全等同于FROM子句中的其他排列,例如
SELECT ....
FROM oranges
LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
bananas,
apples
WHERE ....
Run Code Online (Sandbox Code Playgroud)
要么
SELECT ....
FROM bananas,
apples,
oranges
LEFT JOIN kiwis ON kiwis.orange_id = oranges.id
WHERE ....
Run Code Online (Sandbox Code Playgroud)
只要橘子和猕猴桃之间明确的LEFT JOIN保持不变.从我在各种文档中看到的内容来看,返回的集应该完全相同.
我真的只关心查询的结果,而不是它在实际数据库中的性能.(我正在使用PostgreSQL 8.3,AFAIK不支持关于连接顺序的优化器提示,并将尝试自动创建最佳查询计划).
我正在使用ORM(sqlalchemy)从PG数据库中获取数据.我想避免在我手工制作的SQL语句*中指定所有表列名.
到目前为止,我的假设是返回的列是用于创建db表的DDL语句的顺序.到目前为止,这是有效的 - 但我想知道这只是运气,还是在(ANSI)SQL规范中专门解决.
即ANSI SQL(因此可能是数据库)是否保证SELECT *语句中返回的列的顺序?
我使用PostgreSQL 8.4作为我的后端数据库
是否允许像在postgres中一样在ANSI SQL中转换类型:
SELECT SUM( CAST(qnty AS int) - CAST(reserve AS int) ) AS sum
...
Run Code Online (Sandbox Code Playgroud)
qnty和reserve是字符列.
这是有效的ANSI SQL吗?:
SELECT 1 AS X
,2 * X AS Y
,3 * Y AS Z
Run Code Online (Sandbox Code Playgroud)
因为Teradata(12)可以做到这一点,以及这个(是的,疯了不是它):
SELECT 3 * Y AS Z
,2 * X AS Y
,1 AS X
Run Code Online (Sandbox Code Playgroud)
但是SQL Server 2005需要这样的东西:
SELECT X
,Y
,3 * Y AS Z
FROM (
SELECT X
,2 * X AS Y
FROM (
SELECT 1 AS X
) AS X
) AS Y
Run Code Online (Sandbox Code Playgroud) 这是我的查询在Netezza中不起作用:
UPDATE TABLE1 A
SET A.COL1= (SELECT DISTINCT B.COL1 FROM TABLE2 B WHERE B.ID= A.ID AND B.DeptID=104)
WHERE A.DeptID=3
Run Code Online (Sandbox Code Playgroud)
如何重新编写此查询?请帮忙.
COALESCE 是 ANSI SQL especification 的函数吗?是否受主要关系数据库支持?
ansi-sql ×10
sql ×9
join ×2
postgresql ×2
sql-server ×2
casting ×1
command-line ×1
database ×1
netezza ×1
oracle ×1
sqlalchemy ×1
teradata ×1
validation ×1