Imformix sql 'outer' with and without parenthesis meaning - informix

Having difficulty finding docs/ information on the '(' token and lexeme. Trying to convert to mysql, but the question is informix specific.
I want to know the syntactical difference, if any, for from table0 outer(table1, outer table2)
And from table0 outer table1, outer table2

According to the documentation parentheses are required when the WHERE clause includes a relationship between the subordinate tables in the OUTER clause, i.e. table1 and table2 in your example.
There is further information in the Informix-Extension Outer Joins section of the Guide to SQL: Syntax and in the section Joins that combine outer joins of the Guide to SQL: Tutorial.

Related

Why does Hive warn that this subquery would cause a Cartesian product?

According to Hive's documentation it supports NOT IN subqueries in a WHERE clause, provided that the subquery is an uncorrelated subquery (does not reference columns from the main query).
However, when I attempt to run the trivial query below, I get an error FAILED: SemanticException Cartesian products are disabled for safety reasons.
-- sample data
CREATE TEMPORARY TABLE foods (name STRING);
CREATE TEMPORARY TABLE vegetables (name STRING);
INSERT INTO foods VALUES ('steak'), ('eggs'), ('celery'), ('onion'), ('carrot');
INSERT INTO vegetables VALUES ('celery'), ('onion'), ('carrot');
-- the problematic query
SELECT *
FROM foods
WHERE foods.name NOT IN (SELECT vegetables.name FROM vegetables)
Note that if I use an IN clause instead of a NOT IN clause, it actually works fine, which is perplexing because the query evaluation structure should be the same in either case.
Is there a workaround for this, or another way to filter values from a query based on their presence in another table?
This is Hive 2.3.4 btw, running on an Amazon EMR cluster.
Not sure why you would get that error. One work around is to use not exists.
SELECT f.*
FROM foods f
WHERE NOT EXISTS (SELECT 1
FROM vegetables v
WHERE v.name = f.name)
or a left join
SELECT f.*
FROM foods f
LEFT JOIN vegetables v ON v.name = f.name
WHERE v.name is NULL
You got cartesian join because this is what Hive does in this case. vegetables table is very small (just one row) and it is being broadcasted to perform the cross (most probably map-join, check the plan) join. Hive does cross (map) join first and then applies filter. Explicit left join syntax with filter as #VamsiPrabhala said will force to perform left join, but in this case it works the same, because the table is very small and CROSS JOIN does not multiply rows.
Execute EXPLAIN on your query and you will see what is exactly happening.

Impala join with or query

I am trying to perform a join in impala as such:
Select * from Table1 t1
left outer join Table2 t2 on (t1.column1 = t2.column1 OR t1.column2 = t2.column2)
But I get the following error:
NotImplementedException: Join with 't2' requires at least one conjunctive equality precidate.
To perform a Cartesian product between two tables, use a CROSS JOIN.
I have tried using a CROSS JOIN but it does not work either.
Is it possible to perform or queries on a join in Impala? Is there a work around?
I have tried it using and AND query and it runs successfully.
Any help or advice is appriciated.
As suggested on the Impala JIRA, you can trying rewriting your query with a UNION ALL clause. Unfortunately you'll have to do the deduplication following the UNION ALL manually.

How to use SphinxSE table + sort by "weight desc" when there are other joins in query?

By default, when you perform query to sphinx table, Sphinx engine returns rows which are already sorted by query weight and does it really fast.
So, when I do this:
select
article.name
from article
left join article_ft on article._id=article_ft.id
where article_ft.query='some text;mode=any;';
Where:
article is InnoDB like table.
article_ft is Sphinx table.
Both of them (article.name and article_ft) contain these data (1 line = 1 row):
This is text.
This is also some text.
This is another text.
Sphinx engine will return rows like:
This is also some text.
This is text.
This is another text.
But, If I do something like this:
select
article.name
from article
left join article_ft on article._id=article_ft.id
left join article_category on article.category=article_category._id
where article_ft.query='some text;mode=any;';
It seems, MariaDB sorts it by its own way here.
Even If I provide Sphinx's 'sort' option like this:
select
article.name
from article
left join article_ft on article._id=article_ft.id
left join article_category on article.category=article_category._id
where article_ft.query='some text;mode=any;sort=extended:#weight desc;';
Still it doesn't work.
Changing order of joins doesn't work as well.
If I use order by article_ft.weight DESC MariaDB returns error message like:
Error: ER_ILLEGAL_HA: Storage engine SPHINX of the table `article_ft` doesn't have this option
in case if article has no rows that could match condition like article.category=50.
article_ft was created using this:
CREATE TABLE article_ft
(
id BIGINT NOT NULL,
weight INTEGER NOT NULL,
query VARCHAR(3072) NOT NULL,
INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://192.168.1.98:9402/article_ft";
How to use this "magical" sort by weight feature if query contains more joins with no errors in return?
Thanks forward, for any reply!
P.S. Can't provide you a fiddle for this because I do not know any SQL fiddle online service which supports Sphinx Tables. Also if you found more relevant topic question I'll appreciate that.
Put the article_ft table first in the query. ie ... article_ft inner join article ...
Or maybe use FORCE INDEX, to force the use of the query index. Then it might honour the sort order.
Failing that use a subquery?
(select name,weight from article_ft ... ) order by weight desc;

JPQL join two entities with no direct relations

I have an issue: When I am trying to join two tables which do not have a foreign key or a direct entity relation through my java code within themselves. I am using the below JPQL query: -
SELECT p FROM P p, OM orgm WHERE p.o.id = orgm.o.id and p.u.id = orgm.u.id and orgm.ma = true and p.u.id = ? AND p.o.id IN (:oId);
But this turns to a MySQL query which has a "cross join" which obviously is expensive.
What I need is to make sure that a similar query gives me an inner join MySQL query between the two tables.
I am trying to make usage of the "WITH" clause but seems that it doesn't work with inner join.
Please revert what can be done in this scenario.
Thanks in advance.

can't join 2 queries in coldfusion

I've got a simple question for the coldfusion programmers, i wonder what i've done wrong in this code:
<cfquery name="get_account_plan" datasource="#DSN2#">
SELECT
A.*,
C.*
FROM
ACCOUNT_PLAN A,
#dsn_alias#.COMPANY C
WHERE
A.ACCOUNT_CODE= '#attributes.str_account_code#'
OR A.ACCOUNT_CODE= '#attributes.str_account_code#.%'
AND C.COMPANY_ID = A.ACCOUNT_ID
</cfquery>
why i get the outputs of this query different? for
<cfoutput>#get_account_plan.company_id#</cfoutput>
i get the value of 1 and for
<cfoutput>#get_account_plan.ACCOUNT_ID#</cfoutput>
I get the value of 419?
Check you order of precedence in the where clause. Use parentheses to make the "or" and "and" definition more clear.
You need to specific a type of join, that is a lot more strict.
Either inner join, outer join, left outer join, right outer join.
That's why your data returned is messed up.
Try this:
<cfquery name="get_account_plan" datasource="#DSN2#">
SELECT
A.*,
C.*
FROM
ACCOUNT_PLAN A INNER JOIN #dsn_alias#.COMPANY C ON C.COMPANY_ID = A.ACCOUNT_ID
WHERE
A.ACCOUNT_CODE= <cfqueryparam cfsqltype="cf_sql_varchar" value="#attributes.str_account_code#" />
OR A.ACCOUNT_CODE LIKE '#attributes.str_account_code#.%' <!--- Note LIKE. BTW, you need to sanatise this input! --->
</cfquery>

Resources