On 2008 October 29 (Wed) 03:26:45pm PDT, James Sheridan <[EMAIL PROTECTED]> 
wrote:
> Related addendum:
> 
> In reading it appears that MySQL treats "," as a CROSS JOIN and implements it 
> effectively as an INNER JOIN.
> a) Is this correct?

Not really, no.

MySQL treats "," as a CROSS JOIN, which is consistent with everyone else.

Now, in "standard" SQL, when you use "INNER JOIN", you have to use a
join condition.  (A join condition is something like "ON tasks.id =
projects.task_id" or "USING (id)".)  When you use "CROSS JOIN", you
can't use a join condition.

In MySQL, you can always substitute "CROSS JOIN" for "INNER JOIN" and
vice versa.  So if you say "INNER JOIN" but don't give a join condition,
MySQL assumes you mean "CROSS JOIN", and if you use "CROSS JOIN" but
give a join condition, MySQL acts like you meant "INNER JOIN".

So it's not a matter of implementation.  It's just syntax.

> and b) Is Sqlite acting the same or treating it as a true CROSS JOIN?

SQLite treats "," as a CROSS JOIN, the same as MySQL.

> I suspect I'm writing things that I've used with MySQL for a while that are 
> just 
> not acting the same on Sqlite. That's fine, but I do want to know that if so 
> :)

In the example you gave, both MySQL and SQLite are going to return 0
matches from a cross join with a table with 0 rows.  That's how cross
joins work.  It sounds like you want a LEFT JOIN.

mysql> CREATE TABLE Query (
    ->         id INTEGER NOT NULL,
    ->         creatorID INTEGER NOT NULL,
    ->         ownerID INTEGER NOT NULL,
    ->         type TEXT NOT NULL
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE UserQuery (
    ->         userID INTEGER NOT NULL,
    ->         queryID INTEGER NOT NULL
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO Query (id, creatorID, ownerID, type) VALUES (1, 2, 3, 'a');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT  Q.*
    -> FROM    Query Q,
    ->         UserQuery UQ
    -> WHERE   Q.type = 'a' OR
    ->         (Q.id = UQ.queryID AND
    ->          UQ.userID = '1');
Empty set (0.01 sec)

mysql> SELECT  Q.*
    -> FROM    Query Q
    ->          LEFT JOIN UserQuery UQ
    ->           ON (Q.id = UQ.queryID)
    -> WHERE   Q.type = 'a' OR
    ->          UQ.userID = '1';
+----+-----------+---------+------+
| id | creatorID | ownerID | type |
+----+-----------+---------+------+
|  1 |         2 |       3 | a    | 
+----+-----------+---------+------+
1 row in set (0.00 sec)
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to